簡體   English   中英

使用TSQL創建XML

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM