用于从NTEXT(XML格式)字段中提取值的SQL查询
我在一个NTEXT字段(ou.ORDMODE)中有XML数据,我需要从中解析出一个值(描述)。列可能包含空值。数据如下所示:用于从NTEXT(XML格式)字段中提取值的SQL查询,sql,sql-server,xml,Sql,Sql Server,Xml,我在一个NTEXT字段(ou.ORDMODE)中有XML数据,我需要从中解析出一个值(描述)。列可能包含空值。数据如下所示: <?xml version="1.0" encoding="utf-16"?> <UDFValidatedValue xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UD
<?xml version="1.0" encoding="utf-16"?>
<UDFValidatedValue xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF">
<Description>Export</Description>
<Value>EXP</Value>
<ValueType>String</ValueType>
</UDFValidatedValue>
但Mode3列返回为空
我做错了什么?你可以用这个:
DEclare @xml xml = N'<?xml version="1.0" encoding="utf-16"?>
<UDFValidatedValue xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF">
<Description>Export</Description>
<Value>EXP</Value>
<ValueType>String</ValueType>
</UDFValidatedValue>';
;WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF')
select @xml.value ('(/UDFValidatedValue/Description)[1]', 'nvarchar(100)') as Mode3
演示链接:正如ZLK在评论中指出的,您自己的方法似乎很好,只是索引必须是1而不是0。请在此处尝试: 广告“相当好”:实际上这绝对不是“相当好”,请阅读下面我的提示
DECLARE @tbl TABLE(SomeXmlInText TEXT);
INSERT INTO @tbl VALUES
('<?xml version="1.0" encoding="utf-16"?>
<UDFValidatedValue xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF">
<Description>Export</Description>
<Value>EXP</Value>
<ValueType>String</ValueType>
</UDFValidatedValue>');
SELECT SomeXmlInText
,CAST(REPLACE(CAST(SomeXmlInText as NVARCHAR(MAX)),' xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF"','') as XML).value ('(/UDFValidatedValue/Description/text())[1]', 'nvarchar(100)') as Mode3
FROM @tbl
DECLARE@tbl表(SomeXmlInText文本);
插入@tbl值
('
出口
经验
一串
');
选择SomeXmlInText
,CAST(替换(CAST(SomeXmlInText作为NVARCHAR(MAX)),'xmlns='http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF“,”,作为XML)。值(“(/UDFValidatedValue/Description/text())[1]”,“,nvarchar(100)”作为模式3
来自@tbl
从你的回答,我认为,仍然没有结果
一些可能的问题:
- XML并不像您期望的那样
- 更多/其他名称空间
- 一些奇怪的不,不适合你的问题:-D
TEXT
,NTEXT
和IMAGE
几个世纪以来一直被弃用,不应该再使用了。。。如果您有任何机会改变这一点,那么您应该将您的XML存储在适当的XML类型中
您不需要在字符串级别进行任何强制转换或操作。这可以正常工作,但确实过时了…请使用数据库平台进行标记,并显示已标记的数据库平台。如果您能就如何改进这个问题提供一些反馈,我将不胜感激。因为XML/XPath使用基于一个索引的索引。e、 g.将
text())[0]
更改为text())[1]
。实际上,您甚至不应该真正需要text()
部分,只要(/UDFValidatedValue/Description)[1]
就可以了。谢谢您的回复。进行了建议的更改,但字段仍然返回为空。@ZLK,您可能。。。使用/text()。。。
select @xml.value ('declare namespace
udf="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF";
(/udf:UDFValidatedValue/udf:Description)[1]', 'nvarchar(100)') as Mode3
DECLARE @tbl TABLE(SomeXmlInText TEXT);
INSERT INTO @tbl VALUES
('<?xml version="1.0" encoding="utf-16"?>
<UDFValidatedValue xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF">
<Description>Export</Description>
<Value>EXP</Value>
<ValueType>String</ValueType>
</UDFValidatedValue>');
SELECT SomeXmlInText
,CAST(REPLACE(CAST(SomeXmlInText as NVARCHAR(MAX)),' xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF"','') as XML).value ('(/UDFValidatedValue/Description/text())[1]', 'nvarchar(100)') as Mode3
FROM @tbl