从SQL Server表中形成xml元素

时间:2017-04-13 13:02:52

标签: sql sql-server xml

我想将sql表记录转换为下面的xml格式。你能否提出你的建议。

SQL Server表:

id  name
-------------
1   Arun
2   Raghavan

我想从上表中形成xml元素,如下面的SQL查询格式

<row>
    <Field Name="Customer.id" Value="id">
    <Field Name="Customer.name" Value="arun">
</row>

3 个答案:

答案 0 :(得分:1)

我认为你需要像

这样的东西
SELECT 'Customer.id' AS [@Name]
      ,id AS [@Value]
FROM SomeTable
FOR XML PATH('Field'),ROOT('row');   

如果您确实需要使用表格,并且列的名称在示例中连接在一起,则没有随和。在这种情况下,John Cappelletti's answer很棒!

但请检查这些开箱即用的方法(AUTO会将表格的名称生成为元素的名称):

CREATE TABLE SomeTable (id int,name varchar(50))
INSERT INTO SomeTable VALUES
 (1,'Arun')
,(2,'Raghavan');

SELECT * FROM SomeTable FOR XML AUTO;
SELECT * FROM SomeTable FOR XML RAW;

- 第一个结果

<SomeTable id="1" name="Arun" />
<SomeTable id="2" name="Raghavan" />

- 第二次结果

<row id="1" name="Arun" />
<row id="2" name="Raghavan" />

答案 1 :(得分:1)

这是我思考的地方。

这是一个动态的unpivot,然后转换回合并的XML对象。

我添加了 Cross Apply C 来保存表名,但这可以是一个变量。

Declare @YourTable table (id int,name varchar(50))
Insert into @YourTable values
(1,'Arun'),
(2,'Raghavan')

Select D.*
 From  @YourTable A
 Cross Apply (Select XMLData=cast((Select A.* for XML Raw) as xml) ) B
 Cross Apply (Select TableName='Customer') C
 Cross Apply (
                Select row = (
                                Select [@Name]   = C.TableName+'.'+attr.value('local-name(.)','varchar(100)')
                                      ,[@Value]  = attr.value('.','varchar(max)') 
                                 From  B.XMLData.nodes('/row') as A(r)
                                 Cross Apply A.r.nodes('./@*') AS B(attr)
                                 For XML Path('Field'),Type
                              )
            ) D
 For XML Path(''),Type

<强>返回

<row>
  <Field Name="Customer.id" Value="1" />
  <Field Name="Customer.name" Value="Arun" />
</row>
<row>
  <Field Name="Customer.id" Value="2" />
  <Field Name="Customer.name" Value="Raghavan" />
</row>

答案 2 :(得分:1)

我将此作为第二个答案,因为方法完全不同:

首先我使用SELECT ... FOR XML AUTO。这将创建简单的标记,其中表的名称是元素的名称,所有字段都作为属性生成。

从此我继续FLWOR XQuery。首先,我读取所有节点,然后读取节点内的所有属性。这是根据所需的XML重新生成的:

CREATE TABLE SomeTable (id int,name varchar(50))
INSERT INTO SomeTable VALUES
 (1,'Arun')
,(2,'Raghavan');

- 查询(您可以放置​​任何表格,视图或TVF的名称而不是“SomeTable”)

SELECT
(
SELECT * FROM SomeTable FOR XML AUTO,TYPE  --<-- Here is the simple SELECT
).query('
         for $nd in /*
         return <row>
         {
             for $attr in $nd/@*
             return <Field Name="{concat(local-name($nd),".",local-name($attr))}" Value="{$attr}"/>
         }
         </row>');
GO
--Clean up (careful with real data!)
--DROP TABLE SomeTable;
GO

结果

<row>
  <Field Name="SomeTable.id" Value="1" />
  <Field Name="SomeTable.name" Value="Arun" />
</row>
<row>
  <Field Name="SomeTable.id" Value="2" />
  <Field Name="SomeTable.name" Value="Raghavan" />
</row>