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値と行の内容の2つの列を持つ結果セットが必要です。私はこれを試しました:

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 に答える