日期:2014-05-17  浏览次数:20421 次

关于表中有标识列的插入问题
我有两个表(当前表,历史表),除历史表多一个自增长的标识列(假如名称为ID)以外,其他结构完全一样,假如从F1到Fn,我需要经常将当前表中的数据插入到历史表中,如果没有标识列,通常这么写:
insert into 历史表 select @x as id,* from 当前表
因为有标识列,这么写肯定不行,通常的做法是:
insert into 历史表(f1,f2,....fn) select * from 当前表
但这样写太麻烦,尤其是如果表结构变了(两个表同时会改变,比如增加一列),上面的f1到fn的列名要重新写一遍,非常不方便,有没有简单的办法,比如(当然,下面的方法是不行的,我只是想表达一下我偷懒的想法):
insert into 历史表
select auto,* from 当前表 where....
也就是说,无论两个表结构怎么变,我根本不需要去动存储过程

------解决方案--------------------
如果那么写的话,列设计顺序一定要一样,否则插入的列会出现问题。
我之前做的程序中,就出现了问题。因为表中添加字段的在顺序上不对应,使用*要注意这个

------解决方案--------------------
这个是动态显式列名,这样你就不用担心表结构的更新
DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT  @s = @s + ',' + QUOTENAME(name)
FROM    syscolumns
WHERE   id = OBJECT_ID('表名')
        AND name NOT IN ( '不希望显式的列' )
SET @s = STUFF(@s, 1, 1, '')
EXEC('select '+@s+' from 表名  ')