将SELECT查询结果作为CSV字符串返回

时间:2016-10-18 17:34:19

标签: sql sql-server tsql csv

我有以下Sql Server 2016 SELECT语句,它只返回 1行

SELECT TOP 1 * FROM tempdb.dbo.IMTD

如何将值连接为逗号分隔的字符串? 注意:此临时表的列名称未知,因为它们可以变化

谢谢。

4 个答案:

答案 0 :(得分:0)

或许这样的事情:

-- Sample data
DECLARE @someTable TABLE (SomeID int identity, SomeTxt varchar(100));
INSERT @someTable VALUES ('row1'),('row2'),('row3');

-- Solution
SELECT ConcatinatedString = 
STUFF
((
  SELECT ','+SomeTxt
  FROM @someTable
  FOR XML PATH(''), TYPE
).value('.','varchar(100)'),1,1,'');

答案 1 :(得分:0)

您可以尝试的其他解决方案就是这个。

SELECT LTRIM(RTRIM(<ColumnName1>)) + ',',
       LTRIM(RTRIM(<ColumnName2>)) + ',',
       ...
       LTRIM(RTRIM(<ColumnNamen>)) + ','
FROM tempdb.dbo.IMTD

如果你只想要一行保持那个顶部1在那里像

    SELECT TOP 1
       LTRIM(RTRIM(<ColumnName1>)) + ',',
       LTRIM(RTRIM(<ColumnName2>)) + ',',
       ...
       LTRIM(RTRIM(<ColumnNamen>)) + ','
FROM tempdb.dbo.IMTD

LTRIM和RTRIM将删除任何空格,这应该允许您将结果集复制并粘贴到您可能需要的任何位置。您需要为每个列名执行此操作。

答案 2 :(得分:0)

您可以使用以下查询从临时表中获取列名。

 DECLARE @ColumnNames NVARCHAR(MAX)

 SELECT 
    @ColumnNames= COALESCE(@ColumnNames +',','')+COLUMN_NAME  
 FROM 
    TempDB.INFORMATION_SCHEMA.COLUMNS 
 WHERE 
    TABLE_NAME = '#TempTableName'

答案 3 :(得分:0)

您可以使用动态查询,如下所示:

DECLARE @COLS VARCHAR(MAX) = ''

SELECT @COLS = @COLS + ',' + COLUMN_NAME
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '#table[_]%' -- Dynamic Table (here, Temporary table)

DECLARE @COLNAMES VARCHAR(MAX) = REPLACE(STUFF(@COLS, 1, 1, ''), ',', '+ '','' +')

Declare @cmd varchar(max) = 'Select ' + @COLNAMES + ' as CSVCol from #table'
-- will generate
-- Select Column1+ ',' +Column2+ ',' +Column3 as CSVCol from #table
EXEC (@cmd)