2015-09-24 2 views
0

Я пытаюсь создать следующий XML-документ, и у меня возникли проблемы с пониманием того, как это сделать с помощью TSQL. Я провел много исследований и считаю, что могу это сделать, используя XML-путь вместо XML Explicit. Любая помощь, пытающаяся создать результат ниже, была бы весьма признательна.Создание XML с использованием TSQL

Образец Dataset:

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 ОТ #DataTable дт UNION ALL ВЫБОРА типа = 'defaultBenchmarkPrimaryIdentifier' , dt.BenchmarkCode КАК defaultBenchmarkPrimaryIdentifier ОТ #DataTable дт ДЛЯ XML PATH ('тег'), 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 
Смежные вопросы