将所有列连接成一个字符串

时间:2015-03-13 08:37:19

标签: sql-server

是否可以在字符串中连接表的所有列,包括它们的列名?

question中的第二个(未标记的答案)非常有趣,可能会进一步更改(可能会加入INFORMATION_SCHEMA.COLUMNS)。

如果表有3列(id,name,amount),则输出应为:

id=1;name=something;amount=100

该语句应该是通用的,因为表的列数不同。

2 个答案:

答案 0 :(得分:2)

这应该适合你:

DECLARE @query NVARCHAR(max)
DECLARE @columns NVARCHAR(max)
DECLARE @table NVARCHAR(max)

SET @table = 'tableName'

SELECT @columns = stuff((
            SELECT ', ''' + sc.NAME + '=''' + '+ CAST(' + sc.NAME + ' AS NVARCHAR(MAX))'
            FROM sys.columns sc
            INNER JOIN sys.tables st ON sc.object_id = st.object_id
            WHERE st.NAME = @table
            FOR XML path('')
            ), 1, 1, '')

SELECT @query = 'select ' + @columns + ' from ' + @table

EXEC sp_executesql @query

代码基本上是根据要为其执行此操作的表的所有列创建动态查询的代码。

要准确查看将执行的查询,您可以添加:

SELECT @query命令之前

EXEC,这将打印代码。

创建查询后,它只在最后一部分EXEC sp_executesql执行它。

答案 1 :(得分:0)

如果它只有3列,我会在sql中进行硬编码:

SELECT 'id='+ ISNULL(CAST(id as varchar(10)), '') + 
       ';name='+ ISNULL(name, '') + 
       ';amount='+ ISNULL(CAST(amount as varchar(10)), '')
FROM table
WHERE Condition

我对硬编码解决方案与通用解决方案的推理是代码的性能和可读性。如果你有10个或更多列,我会用sys.Columns表加入problaby并使它更通用。