SQL Server FOR XML PATH动态地改变标签

cmc*_*lan 0 xml sql sql-server

尝试在SQL 2012中使用FOR XML.需要有这样的结果:

<Loader xmlns:xsi="url1" xmlns="url2">
  <Buy_New>
    <Ticker>IBM</Ticker>
    <Acct>12345</Acct>
    <Qty>10</Qty>
  </Buy_New>
  <Sell_New>
    <Ticker>MSFT</Ticker>
    <Acct>12345</Acct>
    <Qty>15</Qty>
  </Sell_New>
  <Buy_New>
    <Ticker>IBM</Ticker>
    <Acct>12345</Acct>
    <Qty>10</Qty>
  </Buy_New>
</Loader>
Run Code Online (Sandbox Code Playgroud)

在这里查看,MSDN等,我没有看到在我的查询中动态更改<Buy_New><Sell_New>(我有大约20种不同类型可用)的方法,我已经探索过使用FOR XML PATH和FOR XML EXPLICIT但两者似乎要求静态元素标签.

有没有办法从查询中的行驱动标签?

@Jon C当然:这就是我所拥有的:

SELECT
(
    SELECT
    Investment1 as Investment,
    EventDate1 as Date,
    Quantity1 as Quantity
    FROM #temptable e1 where e1.temp_id = e.temp_id
    FOR XML PATH(''),TYPE
) AS 'DYNAMICTAG'
FROM #temptable e
FOR XML PATH(''), ROOT('Loader')`
Run Code Online (Sandbox Code Playgroud)

以下是结果示例.DYNAMICTAG是需要改变的部分<Buy_New>,<Sell_New>等等.

<Loader>
  <DYNAMICTAG>
    <Investment>XYZ</Investment>
    <Date>2015-05-08T00:00:00</Date>
    <Quantity>50</Quantity>
  </DYNAMICTAG>
  <DYNAMICTAG>
    <Investment>ABC</Investment>
    <Date>2015-05-08T00:00:00</Date>
    <Quantity>10</Quantity>
  </DYNAMICTAG>
  <DYNAMICTAG>
    <Investment>CSCO</Investment>
    <Date>2015-05-08T00:00:00</Date>
    <Quantity>50</Quantity>
  </DYNAMICTAG>
  <DYNAMICTAG>
    <Investment>IBM</Investment>
    <Date>2015-05-08T00:00:00</Date>
    <Quantity>30</Quantity>
  </DYNAMICTAG>
</Loader>
Run Code Online (Sandbox Code Playgroud)

Jon*_*n C 32

我不确定确定标签应该是'buy_new'还是'sell_new'的条件,但这可能对您有用:

    SELECT
(
    SELECT
    Investment1 as Investment,
    EventDate1 as Date,
    Quantity1 as Quantity
    FROM #temptable e1 where e1.temp_id = e.temp_id
    AND (SOME CONDITION FOR 'Buy_New')
    FOR XML PATH('Buy_New'),TYPE
) ,
(
    SELECT
    Investment1 as Investment,
    EventDate1 as Date,
    Quantity1 as Quantity
    FROM #temptable e1 where e1.temp_id = e.temp_id
    AND (SOME CONDITION FOR 'Sell_New')
    FOR XML PATH('Sell_New'),TYPE
)
FROM #temptable e
FOR XML PATH(''), ROOT('Loader')
GO
Run Code Online (Sandbox Code Playgroud)

编辑:

通过你的回答我明白你需要更有活力的东西.这可能不是您正在寻找的优雅解决方案,但它可以完成工作而无需对每个元素进行硬编码:

首先,创建一个表来存储所需的动态元素名称:

create table elements (id int, name nvarchar(20))

insert into elements (id, name) values (1, 'sell_new')
insert into elements (id, name) values (2, 'buy_new')
insert into elements (id, name) values (3, 'other_new')
Run Code Online (Sandbox Code Playgroud)

然后是变通方法:

SELECT cast('<' + e.name +'>' +
        cast(   
                (
                    SELECT
                    Investment AS 'Investment',
                    EventDate as 'Date',
                    Quantity AS 'Quantity'
                    FROM temptable t1
                    WHERE t1.investment = t.investment
                    FOR XML PATH(''),TYPE
                ) as varchar(max)) 
    + '</' + e.name +'>' as xml)
from temptable t 
JOIN elements e ON e.id = t.RecordType
order by investment
for xml path(''), root('Loader')
Run Code Online (Sandbox Code Playgroud)

结果:

<Loader>
  <sell_new>
    <Investment>abc</Investment>
    <Quantity>456</Quantity>
  </sell_new>
  <buy_new>
    <Investment>cde</Investment>
    <Quantity>789</Quantity>
  </buy_new>
  <sell_new>
    <Investment>efg</Investment>
    <Quantity>0</Quantity>
  </sell_new>
</Loader>
Run Code Online (Sandbox Code Playgroud)