0

我希望能够将 SQL 查询的输出用作 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 数据类型方法“query”的参数 1 必须是字符串文字。

如果我直接输入数字它可以正常工作,所以我知道它与我连接字符串有关

4

3 回答 3

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
于 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 回答
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(公用表表达式)中的关系数据,然后TaxName根据@TaxID.

这确实引出了一个问题:如果您想最终从该 XML 中取回关系值,那么您到底为什么要转换为 XML .....似乎完全没有必要绕道....

于 2013-03-25T21:33:08.350 回答