我有一个表,它包含100个基于特定条件的列,我想在insert语句中只生成一些列。现在我的T-sql语句是用某些列硬编码的。 例如: 该表有100列,但根据条件,我只插入特定的colunms:
insert into temp (id,name,age,gender,contact)
select * from #temp--temp table
答案 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是唯一的方法。