2013-03-25 59 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