带有没有命名空间的SQL Server的XPath

时间:2014-12-09 17:14:51

标签: sql-server xpath xquery

我有一个名为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>

2 个答案:

答案 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]')