SQL Server FOR XML
我在SQL Server中有一个表,该表与具有以下列名的任何其他表类似:SQL Server FOR XML,sql,sql-server,xml,xpath,sqlxml,Sql,Sql Server,Xml,Xpath,Sqlxml,我在SQL Server中有一个表,该表与具有以下列名的任何其他表类似: primaryID | column1 | column2 | column3| column4 | column5 我需要获取该表中的不同字段,并创建以下格式的XML: <Record> <Field id="column1" value="ABCDEFG" /> <Field id="column2" value="Some text" /> <Field id="colum
primaryID | column1 | column2 | column3| column4 | column5
我需要获取该表中的不同字段,并创建以下格式的XML:
<Record>
<Field id="column1" value="ABCDEFG" />
<Field id="column2" value="Some text" />
<Field id="column3" value="Some other text" />
<Field id="column4" value="myValue" />
<Field id="column5" value="88" />
</Record>
在此场景中,将为表中的每条记录创建节点。为该特定记录的每一列创建节点。
我尝试了RAW、PATH、ROOT和EXPLICIT的所有可能组合,但都没有成功
我的建议在SQL Server中是否可行,或者我是否需要在其他地方执行此操作?必须指定for xml路径才能获得所需的节点 以下是基于您的示例的示例:
CREATE TABLE #temp (primaryid INT, column1 VARCHAR(50), column2 VARCHAR(50), column3 VARCHAR(50) )
INSERT INTO #Temp (primaryid, column1, column2, column3 ) VALUES (0, 'abc0', 'some text0', 'myvalue0')
INSERT INTO #Temp (primaryid, column1, column2, column3 ) VALUES (1, 'abc1', 'some text1', 'myvalue1')
SELECT '',
(
SELECT
'column1' AS '@id',
column1 AS '@value'
FROM #temp a
WHERE a.primaryid = #temp.primaryid
FOR XML PATH('Field'), TYPE
),
(
SELECT
'column2' AS '@id',
column2 AS '@value'
FROM #temp a
WHERE a.primaryid = #temp.primaryid
FOR XML PATH('Field'), TYPE
),
(
SELECT
'column3' AS '@id',
column3 AS '@value'
FROM #temp a
WHERE a.primaryid = #temp.primaryid
FOR XML PATH('Field'), TYPE
)
from #Temp
FOR XML PATH('Record'), TYPE
DROP TABLE #temp
上述示例的结果如下:
<Record>
<Field id="column1" value="abc0" />
<Field id="column2" value="some text0" />
<Field id="column3" value="myvalue0" />
</Record>
<Record>
<Field id="column1" value="abc1" />
<Field id="column2" value="some text1" />
<Field id="column3" value="myvalue1" />
</Record>
尽管@Avitus answer为您提供了所需的结果,但在软件开发中,它不仅与结果有关,还与代码的可读性和可维护性有关。所以我决定给你更多的选择: 如果您不介意显式指定列名,这里有一个简单的
选择解决方案。。。对于xml
:
1.1. 选择。。。用于xml自动
select
(
select *
from (values
('column1', column1),
('column2', column2),
('column3', column3)
) as Field(id, value)
for xml auto, type
)
from <Table> as Record
for xml auto
select
(
select *
from (values
('column1', column1),
('column2', column2),
('column3', column3)
) as Field(id, value)
for xml raw('Field'), type
)
from <Table>
for xml raw('Record')
select
(
select *
from (values
('column1', column1),
('column2', column2),
('column3', column3)
) as a([@id], [@value])
for xml path('Field'), type
)
from <Table>
for xml path('Record')
declare @stmt nvarchar(max)
select @stmt = isnull(@stmt + ',','') + '(''' + name + ''', ' + name + ')'
from sys.columns
where
[object_id] = object_id('<Table>') and
name not in ('primaryid')
select @stmt = '
select
(
select *
from (values ' + @stmt + '
) as Field(id, value)
for xml auto, type
)
from <Table> as Record
for xml auto
'
exec sp_executesql
@stmt = @stmt
;with cte_xml as (
select (select a.* for xml raw, type) as data
from #temp as a
)
select
(
select
t.c.value('local-name(.)', 'nvarchar(128)') as [@id],
t.c.value('.', 'nvarchar(128)') as [@value]
from data.nodes('row/@*') as t(c)
where t.c.value('local-name(.)', 'nvarchar(128)') not in ('primaryid')
for xml path('Field'), type
)
from cte_xml
for xml path('Record')