我有两个表(当前表,历史表),除历史表多一个自增长的标识列(假如名称为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....
也就是说,无论两个表结构怎么变,我根本不需要去动存储过程
...全文
1507打赏收藏
关于表中有标识列的插入问题
我有两个表(当前表,历史表),除历史表多一个自增长的标识列(假如名称为ID)以外,其他结构完全一样,假如从F1到Fn,我需要经常将当前表中的数据插入到历史表中,如果没有标识列,通常这么写: insert into 历史表 select @x as id,* from 当前表 因为有标识列,这么写肯定不行,通常的做法是: insert into 历史表(f1,f2,....fn) select * from 当前表 但这样写太麻烦,尤其是如果表结构变了(两个表同时会改变,比如增加一列),上面的f1
无论如何,至少我们的处理思路是一样的,我其实做的是一个GPS数据接收,收到一条定位信息后,更新当前记录(一个车牌号就一条当前记录,便于客户端更新当前状态),同时,将这条记录写到历史库中,便于查询历史轨迹,说白了,相当于下面几句话:
update 当前记录 set GPS信息=XXX WHERE 车牌号=XXX
IF @@ROWCOUNT=0
INSERT INTO 当前记录 (GPS信息,车牌号) values....
insert into 历史记录 select * from 当前记录 where 车牌号=XXXX
因为历史记录很多,用ID做主键便于插入相关附加信息,同时,并发量很大,因此,用标识列而不是手工计算ID
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 表名 ')