1

想象一下,我有一些如下所示的 XML:

DECLARE @xml XML
SET @xml = CAST(N'<row><id>1</id><a>b</a></row><row><id>2</id><a>x</a></row>' AS XML)

那是:

<row>
    <id>1</id>
    <a>b</a>
</row>
<row>
    <id>2</id>
    <a>x</a>
</row>

id 元素是每一行的键,它可能是动态的,所以我将它存储在一个变量中:

DECLARE @idname NVARCHAR(MAX)
SET @idname = N'id'

我想要一个包含两列的结果集,即 id 值和行的内容。我试过这个:

SELECT node.value(N'xxx', N'NVARCHAR(MAX)') AS key, CAST(node.query(N'.') AS NVARCHAR(MAX)) AS value
FROM @xml.nodes(N'/row') AS roots(node)

问题是,我不知道在里面放什么值,而不是 xxx。我希望能够做类似的事情:

node.value(@idname, N'VARCHAR(MAX))

这样我的变量将被评估为 XPath 表达式,但我知道这是不可能的。如果我改用:

node.value(N'sql:variable("@idname")', N'NVARCHAR(MAX)')

它将返回 @idname 变量中的值,而不是评估它。

我想要的是:

--------------------------------------

key           |value

--------------------------------------

1             |<id>1</id><a>b</a>

2             |<id>2</id><a>x</a>

那么,这可能吗?

谢谢!

4

1 回答 1

2
select T.N.value('(*[local-name(.)=sql:variable("@idname")])[1]', 'int') as [key],
       T.N.query('*') as value
from @xml.nodes('/row') as T(N)
于 2012-07-25T17:42:30.573 回答