Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 将表中的所有列转换为字符串SQL_Sql Server_String - Fatal编程技术网

Sql server 将表中的所有列转换为字符串SQL

Sql server 将表中的所有列转换为字符串SQL,sql-server,string,Sql Server,String,如何在SQL中将多列设置为字符串 通过以下方式将单列添加到字符串中: 如何使用它来获取表中所有列的字符串? 我在考虑使用动态SQL 比如说 col1 col2 col3 --------------- 1 7 13 2 8 14 3 9 15 4 10 16 5 11 17 6 12 18 (结果类似于:1,2,3,4,5,6) 如何使其返回: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1

如何在SQL中将多列设置为字符串

通过以下方式将单列添加到字符串中:

如何使用它来获取表中所有列的字符串? 我在考虑使用动态SQL

比如说

col1  col2 col3
---------------
1    7    13 
2    8    14
3    9    15
4   10    16
5   11    17
6   12    18
(结果类似于:
1,2,3,4,5,6

如何使其返回:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18

也许吧,你可以试试这样的

SELECT STUFF(
                    (
                        SELECT  ',' + CAST([col] AS VARCHAR)
                        FROM
                        (
                            SELECT col1 AS col FROM [dbtest].[dbo].[table] UNION
                            SELECT col2 AS col FROM [dbtest].[dbo].[table] UNION
                            SELECT col3 AS col FROM [dbtest].[dbo].[table] 
                        ) alldata
                        FOR XML PATH('')
                    )
                ,   1
                ,   1
                ,   ''
            )
表中的示例数据如下所示

查询输出如下所示:


这是一个如此独特的请求,我不得不试一试。可以在事先不知道列名的情况下连接csv(尽管使用了性能非常差的xquery技巧)。联合动态查询的测试和维护要简单得多,但下面介绍如何实现:

declare @t table (col1 int, col2 int, col3 int);

-- test data
insert into @t
select distinct 
        number,
        number+10,
        number+20
from master..spt_values where number between 1 and 10

select * from @t;
--

declare @x xml;
set @x = (select * from @t for xml path('r'));

;with c_ (s, r)
as  (   select  p.n.query('data(.)').value('.', 'varchar(10)'), 
                p.n.query('local-name(..)').value('.','varchar(10)')
        from    @x.nodes('r//.')p(n)
    )
select [csv] = stuff(
    (   select top 100 percent ','+s
        from    c_ 
        where   r = 'r'
        order
        by      len(s), s
        for xml path('')
    ),1,1,'');

我发现这非常有用,但是,当您不知道列名时,您知道这样做的方法吗?我想这只有在使用动态SQL时才可能…@好的,我修改了一点您的代码,在
联合中添加所有内容,因为我得到的结果是无序的。感谢you@cMinor:不知道列名会让事情变得非常棘手,但却是可行的。查看我的帖子,让我知道它是否有帮助。
declare @t table (col1 int, col2 int, col3 int);

-- test data
insert into @t
select distinct 
        number,
        number+10,
        number+20
from master..spt_values where number between 1 and 10

select * from @t;
--

declare @x xml;
set @x = (select * from @t for xml path('r'));

;with c_ (s, r)
as  (   select  p.n.query('data(.)').value('.', 'varchar(10)'), 
                p.n.query('local-name(..)').value('.','varchar(10)')
        from    @x.nodes('r//.')p(n)
    )
select [csv] = stuff(
    (   select top 100 percent ','+s
        from    c_ 
        where   r = 'r'
        order
        by      len(s), s
        for xml path('')
    ),1,1,'');