【问题标题】:Return SELECT query result as a CSV string以 CSV 字符串形式返回 SELECT 查询结果
【发布时间】:2016-10-18 17:34:18
【问题描述】:

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

SELECT TOP 1 * FROM tempdb.dbo.IMTD

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

谢谢。

【问题讨论】:

  • 你是如何执行这个查询的? SSMS?电源外壳?您自己的应用程序?
  • @alroc 我正在使用 SSMS

标签: sql sql-server tsql csv


【解决方案1】:

可能是这样的:

-- 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,'');

【讨论】:

  • 您能否指定什么是“SomeTxt”,我没有关于临时表中列名的任何信息?
【解决方案2】:

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

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)

【讨论】:

  • 奇怪,@COLUMNNAMES 被截断为 256 个字符(但代码应该可以正常工作)。有什么建议吗?谢谢!
  • 我猜这可能是由于数据类型。您可以通过替换varchar 来尝试使用nvarchar 吗?
  • 是的,我做了:DECLARE @COLNAMES NVARCHAR(MAX) = REPLACE(STUFF(@COLS, 1, 1, ''), ',', '+ '','' +')
  • SELECT LEN(@COLS) 的长度是多少?
  • 选择 len(@COLS) = 171;选择 LEN(@COLNAMES)=346
【解决方案3】:

您可以尝试的另一个解决方案是这个。

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 将删除所有空格,这应该允许您将结果集复制并粘贴到您可能需要的任何位置。您需要为每个列名执行此操作。

【讨论】:

  • 我尝试了两个查询,我得到:'*' 附近的语法不正确。
  • @M.R.抱歉,我忘了你必须像上面的编辑一样指定每个列名。
【解决方案4】:

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

 DECLARE @ColumnNames NVARCHAR(MAX)

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

【讨论】:

  • 我明白了……我以为我可以避免这种情况,它变得复杂了……谢谢你的建议。
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多