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

时间:2017-04-23 21:04:10

标签: 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.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列返回为空白。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

你可以用这个:

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

答案 1 :(得分:0)

正如ZLK在他的评论中指出的那样,你自己的方法似乎很合适,只需索引必须是1而不是0.在这里尝试:

ad &#34;非常好&#34; :实际上这绝对远离&#34;相当不错&#34; ,请阅读下面的提示。 ..

int index = 0;

private void inputBox_KeyDown(object sender, KeyEventArgs e)
{


    if (e.KeyCode == Keys.Enter){
        itemHandler();
        inputBox.Clear();
    }

    // you should check here whether your index is between 0 and reload.Count-1
    if (reload.Count > 0 && index > 1 && index < reload.Count -1){

        if (e.KeyCode == Keys.Up){
            x++;
        }

        if (e.KeyCode == Keys.Down)(
            x--;
        }

        inputBox.Text = reload[index]; 

    }    
}

从你的答案我认为,仍然没有结果......

一些可能的问题:

  • XML并不像你期望的那样
  • 更多/其他名称空间
  • 有些奇怪不,不适合你问题:-D

提示

正如您可能知道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 TEXTNTEXT已被弃用了几个世纪,应该不再使用了......如果您有一点机会改变这一点,那么您应该将XML存储在appropritate XML-type ...

你不应该在字符串级别上进行任何强制转换或操作。这可能有效,但确实过时了......