You'd need to use dynamic SQL. You can query the system catalg view sys.columns
to get the column names, and then use SQL Server's XML Extension to concatenate the rows to a single string giving your final SQL to execute:
DECLARE @TableName SYSNAME = 'dbo.YourTable';
DECLARE @SQL NVARCHAR(MAX) = 'SELECT CONCAT(' +
STUFF(( SELECT ',' + QUOTENAME(c.Name)
FROM sys.columns c
WHERE [object_id] = OBJECT_ID(@TableName)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + ')
FROM ' + @TableName + ';';
EXECUTE sp_executesql @SQL;
ADDENDUM
If you want to delimit your columns, you can add a further concatenation while you are creating your column list:
DECLARE @TableName SYSNAME = 'dbo.YourTable',
@Delimiter VARCHAR(10) = ', ';
DECLARE @SQL NVARCHAR(MAX) = 'SELECT CONCAT(' +
STUFF(( SELECT ',''' + @Delimiter + ''',' + QUOTENAME(c.Name)
FROM sys.columns c
WHERE [object_id] = OBJECT_ID(@TableName)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, LEN(@Delimiter) + 5, '') + ')
FROM ' + @TableName + ';';
EXECUTE sp_executesql @SQL;
ADDENDUM 2
To avoid the delimiter being added when the value is null, e.g instead of ending up with:
1,,,2,3
You simply get
1,2,3
You need to slightly amend the logic, before it was generating a query that was like:
CONCAT([C1], ',', [C2], ',', [C3])
Instead you want:
CONCAT([C1], ',' + [C2], ',' + [C3])
Because you are now using ',' + [C2]
if [C2]
is null, the result will be null, so the delimiter will be removed:
DECLARE @TableName SYSNAME = 'dbo.YourTable',
@Delimiter VARCHAR(10) = ', ';
DECLARE @SQL NVARCHAR(MAX) = 'SELECT CONCAT(' +
STUFF(( SELECT ',''' + @Delimiter + ''' + ' + QUOTENAME(c.Name)
FROM sys.columns c
WHERE [object_id] = OBJECT_ID(@TableName)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, LEN(@Delimiter) + 7, '') + ')
FROM ' + @TableName + ';';
EXECUTE sp_executesql @SQL;
ADDENDUM 3
To remove the first column you can use ROW_NUMBER()
on the sys.columns
system catalog view, then exclude the first column:
DECLARE @TableName SYSNAME = 'dbo.YourTable',
@Delimiter VARCHAR(10) = ', ';
DECLARE @SQL NVARCHAR(MAX) = 'SELECT CONCAT(' +
STUFF(( SELECT ',''' + @Delimiter + ''' + ' + QUOTENAME(c.Name)
FROM ( SELECT name,
RowNumber = ROW_NUMBER() OVER(ORDER BY column_id)
FROM sys.columns c
WHERE [object_id] = OBJECT_ID(@TableName)
) AS c
WHERE c.RowNumber != 1 -- not first column
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, LEN(@Delimiter) + 7, '') + ')
FROM ' + @TableName + ';';
EXECUTE sp_executesql @SQL;