2012-07-25 68 views
1

想象我有一些XML,看起来像这样:在SQL Server中转换一个XML变量的结果集2008

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> 

所以,这是不可能的?

谢谢!

回答

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) 
+0

Mikael:你是男人!谢谢! 顺便说一句,我也发布到http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/04e8c48d-a400-460f-a4dc-5d524405decf,所以,你也可以在那里回答! – 2012-07-25 17:55:55

+0

不客气。 – 2012-07-25 17:56:35

相关问题