如何循环遍历SQL Server中以XML格式存储的xml数据?

时间:2017-01-11 16:11:25

标签: sql-server xml

我有一个SQL查询,它当前获取存储在我的数据库中的列中的值,如下所示:

SELECT 
    @filevalue = (CAST(REPLACE(CAST(de.TRIGGERS_XML_DATA AS VARCHAR(MAX)), 'encoding="utf-16"', '') AS XML).value('(//value)[1]', 'NVARCHAR(max)')), 
    @filecontent = de.ENVIRONMENT_ID
FROM
    dbo.DEPLOYMENT_ENVIRONMENT AS de
WHERE
    de.ENVIRONMENT_ID = CAST(REPLACE(CAST(@filevalue AS numeric(19, 0)), 'encoding="uft-16"', '') AS numeric(19, 0))

它是.value('(//value)[1]')的部分是问题,因为有时会有多个值节点。我试图将一个计数器和值节点连接在一起,但是当我这样做时,它返回错误值需要是一个字符串而不是一个varchar:.value(@ValueNodes, 'NVARCHAR(max)'))

那么我怎样才能成功遍历xml来获取结果呢?我这样做的问题是第一个值并不总是我需要的,并且会给出错误(空值和无法转换类型)。

1 个答案:

答案 0 :(得分:1)

您可以使用深度搜索XPath ,无论身在何处,都会找到所有<value>个节点。您可以在开头使用双//执行此操作。以下内容将提取每个text()中的所有<value>以及父节点名称:

DECLARE @xml XML=
N'<root>
  <value>test1</value>
  <SomeParent>
    <value>test in parent</value>
    <value>one more in parent</value>
  </SomeParent>
  <value>One more on first level</value>
</root>';

SELECT val.value(N'(./text())[1]','nvarchar(max)') AS TheValueInValue
      ,val.value(N'local-name(..)','nvarchar(max)') AS ParentNode
FROM @xml.nodes(N'//value') AS Each(val)

结果

TheValueInValue           ParentNode
test1                     root
test in parent            SomeParent
one more in parent        SomeParent
One more on first level   root

更新

  

...因为我从列中获取xml

这是一次盲目飞行,但您可能需要这样的事情:

WITH Casted AS
(
    SELECT 
         TheXML = CAST(REPLACE(CAST(de.TRIGGERS_XML_DATA AS VARCHAR(MAX)), 'encoding="utf-16"', '') AS XML)
        ,de.ENVIRONMENT_ID
    FROM
        dbo.DEPLOYMENT_ENVIRONMENT AS de
)
SELECT Casted.ENVIRONMENT_ID
      ,val.value(N'(./text())[1]','nvarchar(max)') AS TheValueInValue
      ,val.value(N'local-name(..)','nvarchar(max)') AS ParentNode
FROM Casted
CROSS APPLY TheXML.nodes(N'//value') AS Each(val)