使用TSQL解析/查询XML

时间:2012-01-12 23:10:44

标签: sql xml tsql

我已经打了一段时间了,似乎我很接近但不太相似。我在数据库中有一个列如下:

<document>
<items>
<item name="one">one is the first number</item>
<item name="two">two is the second number</item>
</items>
</document>

在这个例子中,我需要查询并返回'two is the second number'。我也想在不创建临时表的情况下这样做。目前我有:

create table #test (item1 xml)
insert into #test (item1) 
values ('<document> <items> <item name="one">one is the first number</item> <item name="two">two is the second number</item> </items> </document>')

select item1.value('(/document/items/item)[2]', 'nvarchar(max)') from #test
select item1.query('/document/items/item[@name="two"]') from #test

第一个选择返回正确的值,但我需要知道它是第二个'索引' 第二个返回我想要的但它返回整个节点两个..

我错过了什么?并且,有没有一种简单的方法可以使用XML而无需转换为临时表?

2 个答案:

答案 0 :(得分:6)

  

我也想在不创建临时表的情况下这样做

您可以使用数据类型为XML的变量。

declare @xml xml

set @xml = 
'<document>
  <items>
    <item name="one">one is the first number</item>
    <item name="two">two is the second number</item>
  </items>
</document>'

select @xml.value('(/document/items/item[@name="two"])[1]', 'nvarchar(max)')

或者您可以在查询中将字符串转换为XML。

select cast(
            '<document>
              <items>
                <item name="one">one is the first number</item>
                <item name="two">two is the second number</item>
              </items>
            </document>' as xml
           ).value('(/document/items/item[@name="two"])[1]', 'nvarchar(max)')

您的第一个查询使用.value()这是正确的,您的第二个查询具有正确的XQuery表达式。使用.value()时,您需要使用返回单个值的XQuery表达式。这将为您提供@name为两个/document/items/item[@name="two"])的所有项目节点。最后添加[1]可确保您只会在@name为2的XML中首次出现。

答案 1 :(得分:0)

(首先,不是临时表,你可以使用xml类型的变量,如下所示。这些变量可以直接从字符串文字中分配)

所以我认为您的意思是希望item节点的文本值为name two,在这种情况下,您只需要在您使用的xpath中包含适​​当的条件您的value()电话:

DECLARE @x xml

SET @x = '<document> <items> <item name="one">one is the first number</item> 
     <item name="two">two is the second number</item> </items> </document>'

SELECT @x.value('(/document/items/item[@name="two"])[1]', 'nvarchar(max)')

给出

--------------------------------------------------------------
two is the second number

(1 row(s) affected)