我有一个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来获取结果呢?我这样做的问题是第一个值并不总是我需要的,并且会给出错误(空值和无法转换类型)。
答案 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)