[英]Create XML using TSQL
我正在嘗試創建以下XML文檔,並且在理解如何使用TSQL進行操作時遇到了麻煩。 我已經做了大量研究,並且相信我可以使用XML Path代替XML Explicit來做到這一點。 試圖創建以下輸出的任何幫助將不勝感激。
樣本數據集:
CREATE TABLE #DataTable
(
PortfolioShortName varchar(20)
,PortfolioLongName varchar(255)
,BenchmarkName varchar(255)
,BenchmarkCode varchar(255)
,PositionGroupName varchar(255)
)
INSERT INTO #DataTable (PortfolioShortName,PortfolioLongName,BenchmarkName,BenchmarkCode,PositionGroupName)
VALUES ('TESTIG','Long Division Short Duration','SP 500','SP.MC.SP500@rmgBenchmarks','Test Strategy'),
('TESTEM','Short Duration Emerging Market','Dow','Dow.MC.Dow@rmgBenchmarks','Test Strategy')
SELECT
*
FROM #DataTable dt
我正在嘗試創建的XML:
<?xml version="1.0" encoding="UTF-8"?>
<positionGroupMetadata xmlns="urn:TestingData-types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:TestingData:1.0:positiongroupmetadata-types file:///C:/Users/BillBill/Desktop/Schemas/positiongroupmetadata-types.xsd">
<setIdentification>
<client>Georgia Capital</client>
<name>Testing Service</name>
<date>20150924</date>
</setIdentification>
<positionGroupItemList>
<positionGroupItem>
<positionGroupID type="client">
<positionGroupValue>TESTIG</positionGroupValue>
</positionGroupID>
<tagGroupList>
<tagGroup>
<name>Benchmarks</name>
<tagList>
<tag>
<type>defaultBenchmarkName</type>
<value>Long Division Short Duration</value>
</tag>
<tag>
<type>defaultBenchmarkPrimaryIdentifier</type>
<value>SP.MC.SP500@rmgBenchmarks</value>
</tag>
</tagList>
</tagGroup>
</tagGroupList>
</positionGroupItem>
</positionGroupItemList>
<positionGroupByWeightList>
<positionGroupByWeight>
<positionGroupName>Test Strategy</positionGroupName>
<positionList>
<position>
<positionGroupID type="client">
<positionGroupValue>TESTIG</positionGroupValue>
</positionGroupID>
</position>
<position>
<positionGroupID type="client">
<positionGroupValue>TESTEM</positionGroupValue>
</positionGroupID>
</position>
</positionList>
</positionGroupByWeight>
</positionGroupByWeightList>
<reportSetList>
<reportSet>
<reportSetName>DailyReports</reportSetName>
<reportDataSetList>
<reportDataSet>
<reportDataSetName>TESTIG</reportDataSetName>
<positionGroup>
<positionGroupIDList>
<positionGroupID type="client">
<positionGroupValue>TESTIG</positionGroupValue>
<holdingGroupAlias>Portfolio</holdingGroupAlias>
</positionGroupID>
</positionGroupIDList>
</positionGroup>
</reportDataSet>
<reportDataSet>
<reportDataSetName>TESTIG</reportDataSetName>
<positionGroup>
<positionGroupIDList>
<positionGroupID type="client">
<positionGroupValue>TESTIG</positionGroupValue>
<holdingGroupAlias>Portfolio</holdingGroupAlias>
</positionGroupID>
</positionGroupIDList>
</positionGroup>
</reportDataSet>
</reportDataSetList>
</reportSet>
</reportSetList>
</positionGroupMetadata>
據我所知。 我不確定如何建立上層列表並按照結構進行工作。
SELECT DISTINCT
type = 'defaultBenchmarkPrimaryIdentifier'
,value = dt.BenchmarkName
FROM #DataTable dt
UNION ALL
SELECT
type = 'defaultBenchmarkPrimaryIdentifier'
,dt.BenchmarkCode AS defaultBenchmarkPrimaryIdentifier
FROM #DataTable dt
FOR XML PATH('tag'),ROOT('type');
您沒有提供足夠的信息...,請您自己努力。 以下是一個開始,它將幫助您了解FOR XML PATH
。
輸出尚未完成(怎么可能...),還不完全是您所需要的發布內容。 但是您將能夠對其進行調整,並對無法自行解決的細節提出清晰的問題。
需要立即指出的一點:SQL Server 2012(AFAIK)無法抑制嵌套XML中名稱空間的重復。 您可以繼續使用無名稱空間,並在創建過程后使用字符串函數將其填充...
祝好運!
CREATE TABLE #DataTable
(
PortfolioShortName varchar(20)
,PortfolioLongName varchar(255)
,BenchmarkName varchar(255)
,BenchmarkCode varchar(255)
,PositionGroupName varchar(255)
)
INSERT INTO #DataTable (PortfolioShortName,PortfolioLongName,BenchmarkName,BenchmarkCode,PositionGroupName)
VALUES ('TESTIG','Long Division Short Duration','SP 500','SP.MC.SP500@rmgBenchmarks','Test Strategy'),
('TESTEM','Short Duration Emerging Market','Dow','Dow.MC.Dow@rmgBenchmarks','Test Strategy')
SELECT
*
FROM #DataTable dt;
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS [xsi]
,'urn:TestingData:1.0:positiongroupmetadata-types file:///C:/Users/BillBill/Desktop/Schemas/positiongroupmetadata-types.xsd' AS [schemaLocation]
,DEFAULT 'urn:TestingData-types')
SELECT 'Georgia Capital' AS [setIdentification/client]
,'Testing Service' AS [setIdentification/name]
,CONVERT(VARCHAR(8),GETDATE(),112) AS [setIdentification/date]
,node1.positionGroupItemList
FROM (SELECT NULL AS dummy) AS dummy
CROSS APPLY
(
SELECT 'client' AS [positionGroupID/@type]
,PortfolioShortName AS [positionGroupID/positionGroupValue]
,'Benchmarks' AS [tagGroupList/tagGroup/name]
,'defaultBenchmarkName' AS [tagGroupList/tagGroup/tagList/tag/type]
,PortfolioLongName AS [tagGroupList/tagGroup/tagList/tag/value]
,'defaultBenchmarPrimaryIdentifier' AS [tagGroupList/tagGroup/tagList/tag/type]
,BenchmarkCode AS [tagGroupList/tagGroup/tagList/tag/value]
FROM #DataTable
FOR XML PATH('positionGroupItem'),TYPE
) AS node1(positionGroupItemList)
FOR XML PATH(''),ROOT('positionGroupMetadata')
GO
DROP TABLE #DataTable
我采用了一種非常獨特的方法,使用字符串/游標將數據處理為所需的格式。 我沿着結構進行工作,為每個元素添加越來越多的字符串,直到獲得完整的XML文檔。
感謝您的堆堆棧溢出。
DECLARE @EndText varchar(MAX)
SELECT @StartText = '<positionGroupByWeight>
<positionGroupName>' + @Portfolio + '</positionGroupName>
<positionList>'
SELECT @EndText = '</positionList>
</positionGroupByWeight>'
SET @XML = CONVERT(varchar(max),ISNULL(@StartText,'')) + '' + CONVERT(varchar(max),@EndText)
SELECT @XML
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.