2015-09-24 69 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