Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server FOR XML_Sql_Sql Server_Xml_Xpath_Sqlxml - Fatal编程技术网

SQL Server FOR XML

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

我在SQL Server中有一个表,该表与具有以下列名的任何其他表类似:

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')