Sql server tsql:将列转换为xml列,每行一个xml

Sql server tsql:将列转换为xml列,每行一个xml,sql-server,xml,tsql,Sql Server,Xml,Tsql,我所拥有的示例: 表:col1 int,col2 int 示例数据运行时,实际数据将不为人所知: 预期结果:仅一列xml 和4排 抱歉,各位主持人不想删除噪音问题的答案。我希望他能理解我在帮助这些可怜的家伙,这样没人能看出他们完全没有抓住重点。我在保护他们的名誉 这里有一个方法来实现我想要的。但这不是一个好方法,因为xml是手工构建的,没有正确编码 declare @colsList nvarchar(max) set @colsList = '' select @colsList = @col

我所拥有的示例:

表:col1 int,col2 int 示例数据运行时,实际数据将不为人所知:

预期结果:仅一列xml 和4排

抱歉,各位主持人不想删除噪音问题的答案。我希望他能理解我在帮助这些可怜的家伙,这样没人能看出他们完全没有抓住重点。我在保护他们的名誉

这里有一个方法来实现我想要的。但这不是一个好方法,因为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');
编辑 要为每一行生成一个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文档 只需使用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,格式和空格没有固有的含义。因此,要么您想要一个具有多行类似XML的VARCHAR结果,要么您想要XML-选择一行。

越简单越好,越快

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

最简单的方法是使用:

SELECT (SELECT T.* FOR XML RAW)
FROM MyTable T
或者,如果希望对XML结构进行更多控制,则应使用:

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

OP希望每行有一个XML文档,我想是的。预期结果:仅一列xml和4rows@Softion欢迎来到StackOverflow。编辑并不是为了删除你认为没有抓住要点的答案,实际上它并没有删除答案,只是让它比以前更不相关。很好。如果它能从我的观点中隐藏起来,那总比让它变得不那么重要要好。如果答案能增加一些价值,我不会删除它们。但事实并非如此。他们配得上他们的作家,好球。选择结果=从MyTable中为xml路径选择myColumn;是一种奇怪的构造,因为内部select没有from子句。它不适用于选择列表中的*。sql server真的支持它吗?还是黑客攻击?嗯,它很管用。谢谢Softion,请停止尝试删除人们的答案,因为他们完全没有抓住要点。相反,在你的问题中或者在对他们的回答的评论中澄清你实际上在问什么。我在删除之前已经澄清了这个问题。我删除了,这样其他用户就不会被不是针对这个特定问题的答案打扰了。-1是因为放了-1是因为一个不好的原因。你以为你在哪里。在学校这是我的问题,我想怎么做就怎么做。
SELECT (SELECT T.* FOR XML RAW)
FROM MyTable T
SELECT (SELECT T.* FROM (SELECT T.*) T FOR XML AUTO)
FROM MyTable T