【问题标题】:Create XML using TSQL使用 SQL 创建 XML
【发布时间】:2015-09-24 13:51:10
【问题描述】:

我正在尝试创建以下 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');

【问题讨论】:

  • 我认为你没有给我们足够的信息.. 或努力
  • 这就是我所在的地方。 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') ;
  • 签出这个答案,可能会帮助stackoverflow.com/a/14778673/1370442

标签: sql xml tsql


【解决方案1】:

您没有提供足够的信息...请您自己努力。下面是一个开始,帮助你了解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

【讨论】:

  • 感谢您的帮助。这是了解如何嵌套数据的良好开端。
【解决方案2】:

我采用了一种非常独特的方法,使用字符串/游标将数据处理成我需要的格式。我沿着结构往下走,为每个元素添加越来越多的字符串,直到我拥有整个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2019-10-26
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多