【问题标题】:tsql: convert columns into a xml column, one xml per rowtsql:将列转换为 xml 列,每行一个 xml
【发布时间】:2011-02-11 19:04:44
【问题描述】:

我所拥有的示例:

表:(col1 int, col2 int)
样本数据(在运行时不会知道真实数据):

1,1
2,2
3,3
4,4

预期结果:仅一列 (xml)
4 行

row1: <cols><col1>1</col1><col2>1</col2></cols>
row2: <cols><col1>2</col1><col2>2</col2></cols>
row3: <cols><col1>3</col1><col2>3</col2></cols>
row4: <cols><col1>4</col1><col2>4</col2></cols>

对不起,版主不想删除“噪音答案”。我希望他能理解我在帮助这些可怜的家伙,这样没人会看到他们完全没有抓住重点。我在保护他们的名誉...

这是一种实现我想要的方法。但这不是一个好方法,因为 xml 是手工构建的,并且没有正确编码。

declare @colsList nvarchar(max)
set @colsList = ''
select @colsList = @colsList + '+ ''<' + COLUMN_NAME + '>'' + Isnull(cast( [' + COLUMN_NAME + '] as nvarchar(max)),'''') + ''</' + COLUMN_NAME + '>'' ' 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = 'SampleTable';

select @colsList = stuff(@colsList,1,1,'');
exec('select colsValues=cast(' + @colsList + ' as xml) from SampleTable');

【问题讨论】:

  • Softion,请停止尝试删除人们的答案,因为他们“完全没有抓住重点”。相反,请在您的问题或对他们回答的评论中阐明您实际要问的内容。
  • 我已经在删除之前澄清了问题。我删除了其他用户不会被不针对此特定问题的答案打扰。
  • -1 用于将 -1 放入一个不好的原因。你觉得你在哪里。在学校 ?这是我的问题,我会随心所欲地管理它。

标签: sql-server xml tsql


【解决方案1】:

嗯,越简单越好越快。

select d=(select a.* for xml path('r'),type,elements absent)
from MyTable a

【讨论】:

    【解决方案2】:

    最简单的方法是使用这个:

    SELECT (SELECT T.* FOR XML RAW)
    FROM MyTable T
    

    或者,如果您想更好地控制您应该使用的 XML 结构:

    SELECT (SELECT T.* FROM (SELECT T.*) T FOR XML AUTO)
    FROM MyTable T
    

    【讨论】:

      【解决方案3】:

      编辑

      为每一行生成一个 XML 列,您可以使用下面的

      -- this is a poor cousin of a proper sanitize function. Add to it whatever you need
      -- to cater for your column names that will be invalid XML tag names
      -- example below only removes spaces (xml node names cannot contain spaces)
      create function dbo.sanitize(@colname sysname) returns sysname
      as begin
      return replace(@colname,' ', '')
      end
      GO
      
      -- test table
      create table [test table](i int, s varchar(max), [d t] datetime)
      insert [test table] select 1, 'abc', getdate()
      insert [test table] select 2, 'def', getutcdate()
      insert [test table] select 3, 'g', getdate()+10
      insert [test table] select 4, 'hij', getutcdate()+20
      GO
      
      -- the dynamic SQL to return each row as an single XML column
      declare @tablename sysname set @tablename = 'test table';
      declare @colsList nvarchar(max)
      select @colsList = isnull(@colsList+',','') +
          QuoteName(column_name) + ' as ' +
          dbo.sanitize(column_name)
      from INFORMATION_SCHEMA.COLUMNS 
      where TABLE_NAME = @tablename;
      
      select @colsList = '
          select (select ' + @colslist + ' for xml path (''cols''))
          from ' + quotename(@tablename)
      --print @colslist
      exec(@colslist);
      

      作为整个表格的单个 XML 文档

      只需使用 FOR XML,并指定“cols”路径

      declare @tbl table (col1 int, col2 int)
      insert @tbl values (1,1)
      insert @tbl values (2,2)
      insert @tbl values (3,3)
      insert @tbl values (4,4)
      
      -- you can use just the part below here
      select col1, col2
      from @tbl
      for xml path('cols')
      

      输出

      <cols>
        <col1>1</col1>
        <col2>1</col2>
      </cols>
      <cols>
        <col1>2</col1>
        <col2>2</col2>
      </cols>
      <cols>
        <col1>3</col1>
        <col2>3</col2>
      </cols>
      <cols>
        <col1>4</col1>
        <col2>4</col2>
      </cols>
      

      请注意,对于 XML,格式和空格没有固有含义。所以要么你想要一个多行的 VARCHAR 结果(类似于 XML),要么你想要 XML - 选择一个。

      【讨论】:

      • 我认为 OP 希望每行都有一个 XML 文档。
      • 是的。 “预期结果:只有一列 (xml) 和 4 行”
      • @Softion 欢迎来到 StackOverflow。编辑不是为了删除你认为没有抓住重点的答案,实际上它并没有删除答案,只是让它变得比以前更不相关。
      • 不错。如果它可以隐藏在我的视野之外,那将比仅仅让它不那么相关要好。如果答案可以增加一些价值,我就不会删除它们。但他们没有。他们应该得到他们的作家。
      • 不错的镜头。从 MyTable 中选择结果 =(为 xml 路径选择 myColumn);是一个奇怪的结构,因为内部 select 没有 from 子句。它不适用于选择列表中的 *。 sql server 真的支持它还是 hack ?那么它的工作原理。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2013-03-31
      • 2013-06-16
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      相关资源
      最近更新 更多