插入包含动态列的语句

时间:2014-05-14 06:58:57

标签: tsql

我有一个表,它包含100个基于特定条件的列,我想在insert语句中只生成一些列。现在我的T-sql语句是用某些列硬编码的。 例如: 该表有100列,但根据条件,我只插入特定的colunms:

insert into temp (id,name,age,gender,contact) 
select * from #temp--temp table

3 个答案:

答案 0 :(得分:2)

这是一个完整的例子:

create table temp (id int,name varchar(20),code int, morecolumns int) 
create table #temp(id int,name varchar(20),code int)

insert #temp values(1,'Thomas Clausen',1)

select * into xx_temp from #temp

declare @col varchar(max) , @sql varchar(max) = ''

select @col = coalesce(@col + ',', '')+ '[' + name + ']'
from tempdb.sys.columns 
where object_id = object_id('tempdb..#temp');

select @sql='insert temp(' + @col+ ') select '+@col+' from xx_temp'  

exec (@sql)
go
drop table xx_temp

有一个缺点,这个例子会创建一个表xx_temp并在执行后立即删除它。因此,脚本不应该一次执行多次。 创建表xx_table以将数据放入动态sql

中的相同作用域

答案 1 :(得分:0)

您可能希望将查询构造为字符串(varchar),然后使用 -

执行它
Exec sp_executesql

例如 -

Declare @sql varchar(max)
SET @sql = 'insert into temp '

现在,您可以将列的名称添加到@sql变量中,具体取决于您的逻辑。

答案 2 :(得分:0)

如果您不想指定列,可以选择进入

SELECT * 
INTO newTable
FROM #source

这将执行您想要的操作,但newTable表必须不存在(此查询将创建表)。 如果你想插入现有的你必须指定列,我很遗憾地说,但生成的字符串查询的EXEC是唯一的方法。