2012-07-25 99 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