【问题标题】:Convert Records To Special XML Objects将记录转换为特殊的 XML 对象
【发布时间】:2017-01-30 17:42:09
【问题描述】:

我需要将其中一行转换为具有以下特定格式的 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

【问题讨论】:

  • 请添加您的表架构。
  • 能不能展示一下表格结构
  • 请展示一些示例数据和您的查询
  • CREATE TABLE Teacher (id INT, name VARCHAR(10), value VARCHAR(100))
  • 您将从哪里获得表ID、表名和数据类型

标签: sql xml tsql


【解决方案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;

根据我的标题,数据来自表格。为了模拟一个测试场景,我使用了一个声明的表变量并用你的数据填充它。

下次您在这里提出关于 SO 的问题时,这部分应该由您完成。您获得好答案的机会大大增加: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>

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 2019-09-21
    • 1970-01-01
    • 2016-03-31
    • 2013-07-13
    • 2011-06-05
    • 2020-05-11
    • 2012-04-10
    • 2011-12-07
    相关资源
    最近更新 更多