2015-09-24 71 views
0

我正嘗試創建以下XML文檔,並且無法理解如何使用TSQL執行此操作。我做了大量的研究,並相信我可以使用XML Path來代替XML Explicit。任何幫助試圖創建下面的輸出將不勝感激。使用TSQL創建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','[email protected]','Test Strategy'), 
('TESTEM','Short Duration Emerging Market','Dow','[email protected]','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>[email protected]</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'); 
+0

我不認爲你給我們足夠的信息..或努力 – JamieD77

+0

這是我在哪裏。 \t \t \t SELECT DISTINCT 類型= 'defaultBenchmarkPrimaryIdentifier' ,值= dt.BenchmarkName FROM #DataTable DT UNION ALL SELECT 類型= 'defaultBenchmarkPrimaryIdentifier' ,dt.BenchmarkCode AS defaultBenchmarkPrimaryIdentifier FROM #DataTable DT FOR XML PATH('tag'),ROOT('type'); – Alex

+0

結帳這個答案,可能會有所幫助http://stackoverflow.com/a/14778673/1370442 – bUKaneer

回答

0

您沒有提供足夠的信息請自行完成。以下是一個可以幫助你理解FOR XML PATH的能力的開始。

輸出尚未完成(它怎麼可能......),它還不是你根據需要發佈的。但是,你將能夠適應它,並在你自己無法解決的細節問題上回答明確的問題。

立即指出:嵌套XML中名稱空間的重複無法用SQL Server 2012(AFAIK)來表達。你可以繼續沒有命名空間,並在創建字符串函數的過程之後填入它們...

祝你好運!

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','[email protected]','Test Strategy'), 
('TESTEM','Short Duration Emerging Market','Dow','[email protected]','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 
+0

謝謝你的幫助。這是瞭解如何嵌套數據的好開始。 – Alex

0

我走了一個非常獨特的方法使用字符串/遊標來操縱數據到我需要的格式。我按照結構爲每個元素添加了越來越多的字符串,直到我擁有了整個XML文檔。

感謝hep堆棧溢出。

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