我有一个表Employee
,其中有几个字段,如FirstName,LastName,Email,.......
。所以我想做的是在我的情况下,选择列是动态的
Declare @columnNeeded nvarchar(max)
示例一
Set @columnNeeded = 'FirstName,Email'
Select @columnNeeded from Employee
示例二
Set @columnNeeded = 'FirstName,LastName'
Select @columnNeeded from Employee
这很简单,现在我想要的是,无论结果集中的列是什么,我都需要在一列中选择所有列作为逗号分隔字符串。我在mysql中看到了Group_Concat()但是不知道如何在sql中执行此操作。这可能吗?
答案 0 :(得分:4)
您可以使用动态SQL执行此操作:
declare @sql nvarchar(max) = 'select @columns from Employee';
declare @columnNeeded nvarchar(max) = 'FirstName,Email';
set @sql = replace(@sql, '@columns', @columnNeeded);
exec sp_executesql @sql;
编辑:
如果您想将它们作为一列,您可以这样做:
declare @sql nvarchar(max) = 'select @columns from Employee';
declare @columnNeeded nvarchar(max) = 'FirstName,Email';
set @sql = replace(replace(@sql, '@columns', @columnNeeded), ',', '+'',''+');
exec sp_executesql @sql;
要输入类型安全,您可以转换列值:
declare @tmp nvarchar(4000) = 'cast(' +
replace(@columnNeeded, ',', ', nvarchar(4000)), cast(') +
', nvarchar(4000))'
set @sql = replace(replace(@sql, '@columns', @columnNeeded), ',', '+'',''+');
如果按预期工作,则会将cast(<col> as nvarchar(4000))
添加到列表中的每个列。
答案 1 :(得分:1)
您必须使用Dynamic SQL
。由于您的表格中有Data types
个不同,因此您可能必须convert
columns
到Varchar
到concatenate
将结果转换为单列。
DECLARE @sql NVARCHAR(max),
@cols NVARCHAR(max) ='FirstName,Email'
SELECT @cols = 'convert(varchar(100),'
+ Replace(@cols+')+', ',', ')+'',''+convert(varchar(100),')
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
SET @sql ='select ' + @cols + ' from Employee '
--print @sql
EXEC Sp_executesql @sql;
工作示例:
CREATE TABLE #test1([Key] INT,ID INT,Value VARCHAR(2))
INSERT #test1
VALUES (1,1,'C' ),(2,1,'C' ),(3,1,'I' )
DECLARE @sql NVARCHAR(max),
@cols NVARCHAR(max) ='ID,Value'
SELECT @cols = 'convert(varchar(100),'
+ Replace(@cols+')+', ',', ')+'',''+convert(varchar(100),')
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
SET @sql ='select ' + @cols + ' from #test1 '
EXEC Sp_executesql @sql;