我想将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>
答案 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>