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)
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |