我已经打了一段时间了,似乎我很接近但不太相似。我在数据库中有一个列如下:
<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而无需转换为临时表?
答案 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)