使用T-SQL生成不同的元素/行以输出到XML

时间:2015-07-24 15:58:16

标签: sql-server xml excel

我遇到了让SQL服务器生成我正在寻找的XML文件类型的问题。我有一个非常基本的查询,最终将生成53行。反过来,我需要在excel电子表格的不同区域中唯一地映射每一行。

Select ID, Value
From Table
FOR XML Path

这会创建XML

<Row>
   <Id> 1 </Id>
   <Value> X </Value>
</Row>
<Row>
   <Id> 2 </Id>
   <Value>Y </Value>
</Row>

使用架构

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="row">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ID" type="xs:string" />
                <xs:element name="Value" type="xs:decimal" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

这会产生一个模式和XML文件,可以获取我需要的数据,但是我无法清楚地映射每一行。对于这个项目,我可以改变任何事情,除了我需要SQL来生成模式和XML本身,而不是像我过去那样自己编写。

理想情况下,我会寻找一个看起来像这样的XML文件

 <Row1>
       <Id> 1 </Id>
       <Value> X </Value>
 </Row1>
 <Row2>
       <Id> 2 </Id>
       <Value>Y </Value>
 </Row2>

使用理想的架构

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="row1">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ID" type="xs:string" />
                <xs:element name="Value" type="xs:decimal" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="row2">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ID" type="xs:string" />
                <xs:element name="Value" type="xs:decimal" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

我也尝试过其他XML路由(auto / raw / explicit),但它也没有用。谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了我的问题的解决方案,我想我会发布它只是为了帮助其他人。

我使用动态数据透视表将每个不同的行移动到一个只有一个值的单独列中。

首先,我将数字1添加到我的select语句的开头,以便在未来的数据透视中,每个答案将共享相同的第一个元素

Select 1, 'ColumnName', 'Value'
INTO DBO.db.Table1
FROM Table 


DECLARE @cols NVARCHAR(MAX) 
DECLARE @query NVARCHAR(MAX) 



SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT 
                                '],[' + t.ColumnName 
                        FROM   Dbo.Db.Table1 AS t 
                        --ORDER BY '],[' + t.ID 
                        FOR XML PATH('') 
                      ), 1, 2, '') + ']' 

--SELECT  @cols

SET @query = N'SELECT ID,'+ @cols +'
INTO dbo.db.PivotTable
FROM
(SELECT t1.iD, t1.ColumnName, t1.Value 
FROM db.dbo.Table1 AS t1) p 
PIVOT (MAX([Value]) FOR ColumnName IN ( '+ @cols +' )) 
AS pvt;' 

EXEC (@query)


Select * into #Temp FROM db.dbo.PivotTable

select * from #TEMP
FOR XML AUTO, ROOT('Root1D')

DROP TABLE #Temp

然后我能够创建一个模式文件,将其加载到excel文档中,然后将每个元素映射到我想要的任何地方。之后,我刚刚导入了上述程序生成的XML文件,并且运行正常。