我有一个名为image的文本字段,用于保存XML。下面是一个子集。没有定义的命名空间,所以我使用通配符'*'。
<?xml version="1.0"?>
<NewDataSet>
<delivery>
<ticket>A430901474</ticket>
<revision>00A</revision>
</delivery>
<tickets>
<ticket>A430901474</ticket>
<revision>00A</revision>
<state>VA</state>
<county>PRINCE WILLIAM</county>
<lot>1</lot>
<st_from_address>15414</st_from_address>
</tickets>
</NewDataSet>
下面的查询似乎正在运行,但它也会返回标记。如果标签在那里,我只需要属性的值。
DECLARE @x xml
SET @x = (SELECT [image]
FROM [QM].[dbo].[ticket]
where ticket_id = 83831107)
SELECT @x.query('(/*:NewDataSet/*:tickets/*:lot)[1]')
现在我回来了:
**LotNo**
<lot>1</lot>
答案 0 :(得分:3)
query()
返回xml ...因此,它不适合您的任务。由于您只是请求单个值,因此您可能希望使用value()
代替fiddle):
select @xml.value('(/*:NewDataSet/*:tickets/*:lot)[1]','int')
假设为了论证,你可以在那里有多个lot
个节点,你可以像nodes()
那样使用fiddle方法:
select
t.c.value('.', 'int') as Lot
from @xml.nodes('/*:NewDataSet/*:tickets/*:lot') as t(c)
答案 1 :(得分:1)
您应该能够使用text()
node-test来获取文本值:
DECLARE @x xml
SET @x = (SELECT [image]
FROM [QM].[dbo].[ticket]
where ticket_id = 83831107)
SELECT @x.query('(/*:NewDataSet/*:tickets/*:lot/text())[1]')