0

SQLServer2012のXMLクエリのパラメーターとしてSQLクエリからの出力を使用できるようにしたいと思います。次に例を示します。

Declare @xml = (Select uniqueTaxID, taxName 
                from Taxes 
                where orderGroup = @someNumber 
                for xml path('Tax'), root('Taxes'))

期待される出力は、注文に適用されるすべての税金を私に与えます。税金は1つ、または複数ある可能性があります。

出力例:

<Taxes>
    <Tax>
        <uniqueTaxID>1</uniqueTaxID>
        <taxName>Some Tax</taxName>
    </Tax>
    <Tax>
        <uniqueTaxID>2</uniqueTaxID>
        <taxName>Some Other Tax</taxName>
    </Tax>
</Taxes>

今、私は別の簡単なSQLクエリを持っています

Select taxID, someItem, @xml.query('
    for $i in Taxes/Tax/uniqueTaxID
    return Taxes/Tax/taxName
    ') from someGroupOfItems

残念ながら、それが書かれている方法では、私は両方の<taxName>要素を取得します。これは動的である必要があります。1の場合taxID、XMLクエリはを返しSome Tax、2の場合は、を返しSome Other Taxます。

私は試した:

Select taxID, someItem, @xml.query('
    for $i in Taxes/Tax/uniqueTaxID
    where $i = ' + taxID + '
    return $i')

しかし、それは私にエラーを与えました

XMLデータ型メソッド"query"の引数1は、文字列リテラルである必要があります。

数字を直接入力するとうまくいくので、文字列を連結することと関係があることがわかります

4

3 に答える 3

0

あなたがやろうとしていることを本当に理解しているかどうかわかりません-<taxName>与えられた値に基づいて、あなたが持っているXMLから要素の値を抽出しようとしていtaxIDますか?

もしそうなら-それからこのようなことを試してください(@XML入力としてあなたの変数を使って):

DECLARE @TaxID INT = 1

;WITH CTE AS
(
    SELECT
        UniqueTaxID = TaxNode.value('(uniqueTaxID)[1]', 'int'),
        TaxName = TaxNode.value('(taxName)[1]', 'varchar(100)')
    FROM 
        @XML.nodes('/Taxes/Tax') AS XTbl(TaxNode)
)
SELECT TaxName
FROM CTE
WHERE UniqueTaxID = @TaxID

基本的に、XMLをCTE(Common Table Expression)のリレーショナルデータに「細断処理」してTaxNameから、に基づいて適切な値を抽出します@TaxID

これは本当に疑問を投げかけます:もしあなたがそのXMLから最終的にリレーショナル値を取り戻したいのなら、なぜあなたはそもそもXMLに変換しているのですか.....まったく不必要な迂回のようです...。

于 2013-03-25T21:33:08.350 に答える
0

これは、質問の「SQLクエリからの出力を使用する」部分に直接答える可能性があるmarc_sが提案したもののバージョンです。取得するUniqueTaxIDの値(1および3)は、ここの表にあります。

declare @xml XML = N'<Taxes>
    <Tax>
        <uniqueTaxID>1</uniqueTaxID>
        <taxName>Some Tax</taxName>
    </Tax>
    <Tax>
        <uniqueTaxID>2</uniqueTaxID>
        <taxName>Some Other Tax</taxName>
    </Tax>
    <Tax>
        <uniqueTaxID>3</uniqueTaxID>
        <taxName>Third Tax</taxName>
    </Tax>
</Taxes>';

WITH someGroup(taxID) AS (
  SELECT 1 UNION ALL SELECT 3
), Tax(uniqueTaxID,taxName) AS (
  SELECT
    x.value('(uniqueTaxID)[1]', 'int'),
    x.value('(taxName)[1]','nvarchar(max)')
  FROM @xml.nodes('/Taxes/Tax') as X(x) 
)
  SELECT
    g.taxID,
    t.taxName
  FROM Tax AS t
  JOIN someGroup AS g
  ON g.taxID = t.uniqueTaxID
于 2013-03-26T03:25:59.887 に答える
0

sql:column()を使用してXQuery式のテーブルから値にアクセスし、value()を使用してXMLから単一の値を抽出できます。

select T.taxID,
       @xml.value('(
                   for $i in /Taxes/Tax
                   where $i/uniqueTaxID = sql:column("T.TaxID")
                   return $i/taxName
                   )[1]', 'nvarchar(50)') as taxName
from someGroupOfItems as T

FLOWRなしでも同じことができます。

select T.taxID,
       @xml.value('(/Taxes/Tax[uniqueTaxID = sql:column("T.TaxID")]/taxName)[1]', 'nvarchar(50)') as taxName
from someGroupOfItems as T
于 2013-03-26T06:18:20.323 に答える