2

xmlデータ型の列に次のサンプルxmlがあります。

 <diagnostics CurrentIterationNumber="79" TotalItemsProcessed="37847"
 ItemsProcessedLastIteration="75" ItemsProcessedPerIteration="479" />

クエリする属性の名前を渡すことができるストアドプロシージャが必要です。次に、その値を変数に格納して、別の一連の計算を実行します。

.value関数は文字列リテラルを期待していることを読みました。Web上の多くのリソースは、これにsql:variable()関数を使用するようにアドバイスしています。ただし、変数の実際の内容を返すコードが残っています。

次の行に沿って何かを試してみてください。

declare @property as varchar(50);
set @property = '@CurrentIterationNumber';

declare @x as xml;
set @x = (select PropertyValues from dbo.tblDiagnosticsSnapshot);
SELECT
    t.c.value('sql:variable("@property")', 'varchar(50)')
FROM
    @x.nodes('/diagnostics') t(c);
4

1 に答える 1

3

を使用/diagnostics/@*して属性のリストを取得し、と比較して必要な属性を取得local-name()できます。

declare @x xml 
set @x = '<diagnostics CurrentIterationNumber="79" TotalItemsProcessed="37847"
 ItemsProcessedLastIteration="75" ItemsProcessedPerIteration="479" />'

declare @property as varchar(50);
set @property = 'CurrentIterationNumber';

select @x.value('(/diagnostics/@*[local-name() = sql:variable("@property")])[1]', 'varchar(50)')

または、サンプルXMLのように1つだけではなく、値のリストが必要な場合は、このようにします。

select t.c.value('.', 'varchar(50)')
from @x.nodes('/diagnostics/@*[local-name() = sql:variable("@property")]') as t(c)

注:@検索文字列にを含めることはできません。set @property = 'CurrentIterationNumber';

于 2012-02-02T14:29:22.943 に答える