SQL查询以从NTEXT(XML格式)字段中分解一个值



我在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

从我的回答中,仍然没有结果...

一些可能的问题:

  • XML并不是您所期望的
  • 更多/其他命名空间
  • 一些怪异的不,不是您的问题问题:d

提示

您可能知道TEXTNTEXTIMAGE已弃用了几个世纪,并且不应该再使用了……如果您有丝毫更改此设置的机会,那么您应该将XML存储在Apripate XML-type中。..

您不需要在字符串级别上进行任何铸件或操作。这可以正常工作,但确实过时了...

最新更新