用于从NTEXT(XML格式)字段中提取值的SQL查询

用于从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

我在一个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.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