我在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列返回为空白。
我做错了什么?
答案 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];
}
}
从你的答案我认为,仍然没有结果......
一些可能的问题:
正如您可能知道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
已被弃用了几个世纪,应该不再使用了......如果您有一点机会改变这一点,那么您应该将XML存储在appropritate XML-type ...
你不应该在字符串级别上进行任何强制转换或操作。这可能有效,但确实过时了......