2013-03-25 90 views
0

我希望能夠使用SQL查詢中的輸出作爲SQL Server 2012中XML查詢中的參數。下面是一個示例。sql server 2012中xml的問題

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>元素。我需要這是動態的。如果taxID是1,那麼我希望我的XML查詢返回Some Tax,如果它是2,那麼它將返回Some Other Tax

我想:

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

但是,這給了我錯誤

XML數據類型的方法「查詢」的參數1必須是一個字符串文字。

如果我直接在它工作正常鍵入數字,所以我知道它有什麼與我的串聯字符串

+1

是否有理由使用XML來做到這一點?爲什麼不在一個查詢中使用表之間的外連接? – 2013-03-25 20:23:38

回答

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 
0

不知道如果我真的能理解你正在試圖做的是什麼 - 是您是否試圖根據給定的taxID值從您擁有的XML中提取<taxName>元素的值?

如果是這樣的 - 然後再嘗試像這樣(與你的@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關係數據(公用表表達式),然後提取基於@TaxID的值,從它適當的TaxName

這確實引出了一個問題:爲什麼到底要轉換爲XML呢?如果你想從XML中獲得關係值......似乎是一個完全不必要的彎路。 ..

0

以下是marc_s建議的一個版本,可能會更直接地回答「使用SQL查詢的輸出」部分的問題。這裏檢索的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