想象一下,我有一些看起来像这样的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>
那么,这有可能吗?
谢谢!
答案 0 :(得分: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)