我在ntext字段(ou.ordmode(中具有XML数据,我需要从中解析一个值(description(。列可能包含零值。数据看起来像这样:
<?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>
我在查询中的行是:
CAST(REPLACE(CAST(ou.ORDMODE as NVARCHAR(MAX)),' xmlns="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF"','') as XML).value ('(/UDFValidatedValue/Description/text())[0]', 'nvarchar(100)') as Mode3,
但是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
或
select @xml.value ('declare namespace
udf="http://schemas.datacontract.org/2004/07/Accellos.Platform.UDF";
(/udf:UDFValidatedValue/udf:Description)[1]', 'nvarchar(100)') as Mode3
演示链接:rextester
正如ZLK在他的评论中指出的那样,您自己的方法似乎还不错,只有索引必须是1而不是0。
ad "相当好," 从我的回答中,仍然没有结果... 一些可能的问题: 您可能知道 您不需要在字符串级别上进行任何铸件或操作。这可以正常工作,但确实过时了... 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
提示
TEXT
,NTEXT
和IMAGE
已弃用了几个世纪,并且不应该再使用了……如果您有丝毫更改此设置的机会,那么您应该将XML存储在Apripate XML-type中。..