将记录转换为特殊XML对象

时间:2017-01-30 17:42:10

标签: sql xml tsql

我需要将其中一行转换为具有特定格式的xml,如下所示:

<root>
    <TableID>101</TableID>
    <TableName>Teacher</TableName>
    <Objects>
        <Object>
            <id>1</id>
            <name>X</name>
            <value>abc</value>
            <DataType>Int</DataType>
        </Object>
        <Object>
            <id>2</id>
            <name>Y</name>
            <value>def</value>
            <DataType>char</DataType>
        </Object>
    </Objects>
</root>

我的尝试如下,主要是我有如何创建(对象)节点的问题:

DECLARE @TableID int  = 1,
@TableName NVARCHAR(200)

SELECT  @TableID TableID ,
@TableName TableName ,
( SELECT    '1' "id" ,
'x' "name" ,
abc "value" ,
'DataType' "DataType"
FOR
XML PATH('Object') ,
TYPE
)
FROM    Teacher AS T1
FOR     XML PATH('root') ,
TYPE

1 个答案:

答案 0 :(得分:1)

你的问题很不清楚......但我的魔法水晶球告诉我你尝试过这样的事情:

此代码完全硬编码并完全生成所需的结果。但这很可能不是,你在寻找什么(将记录转换为特殊的xml对象):

DECLARE @TableID INT = 1,
        @TableName NVARCHAR(200)='Teacher';

SELECT  @TableID TableID ,
        @TableName TableName ,
        ( 
         SELECT u.*
         FROM
         (
             SELECT    '1' "id" ,
                       'x' "name" ,
                       'abc' "value" ,
                       'DataType' "DataType"
             UNION ALL
             SELECT    '2' "id" ,
                       'Y' "name" ,
                       'def' "value" ,
                       'char' "DataType"
         ) AS u
        FOR XML PATH('Object'),ROOT('Objects') ,TYPE
        )
FOR XML PATH('root') ,TYPE;

从我的标题中我得知,数据来自一张桌子。要模拟测试场景,我使用声明的表变量并将其填入您的数据。

下次你在这里问一个问题时,这个部分应该由你来完成。您获得良好答案的机会大大增加:How to ask a good SQL questionHow to create a MCVE

DECLARE @TableID INT = 1,
        @TableName NVARCHAR(200)='Teacher';

DECLARE @Teacher TABLE(id INT IDENTITY,name VARCHAR(100),value VARCHAR(100),DataType VARCHAR(100));
INSERT INTO @Teacher VALUES ('x','abc','DataType')
                           ,('Y','def','char');


SELECT  @TableID TableID ,
        @TableName TableName ,
        ( 
         SELECT t.*
         FROM @Teacher AS t
         FOR XML PATH('Object'),ROOT('Objects') ,TYPE
        )
FOR XML PATH('root') ,TYPE;

两者都有相同的结果

<root>
  <TableID>1</TableID>
  <TableName>Teacher</TableName>
  <Objects>
    <Object>
      <id>1</id>
      <name>x</name>
      <value>abc</value>
      <DataType>DataType</DataType>
    </Object>
    <Object>
      <id>2</id>
      <name>Y</name>
      <value>def</value>
      <DataType>char</DataType>
    </Object>
  </Objects>
</root>