在MS SQLServer2005中数据库之间的数据导入是一个很简单的方法,可以直接使用导入功能完成数据导入,但有时候,我们要导入的目标数据表中因为有自增量,会导致导入数据失败。对于这种情况,我原来是用的比较笨的方法,针对每个表手工写导入命令,其过程一般是:
1. 先查看这张表是否有自增量
2. 如果有自增量,在导入数据前,先使用set identity_insert TableName On,然后使用insert into TableName (.......) select ...... from SrcTableName
3. 数据导入完成后,再使用set identity_insert TableName Off
4. 如果要导入的数据表没有自增量,那就直接使用insert into TableName (....) select .... from SrcTableName
曾经远程为一个客户进行技术支持,就使用的上述方法,虽然数据表不多,才30多个,但是重复使用上述步骤,要累的我要吐血(远程操作太慢),而且容易出错!后来考虑到,既然每一张表都要这样判断,那这就是规律,既然有规律,那就可以考虑让计算机来完成,于是我写出下面这段code,现在只需要执行这段code,就可以顺利完成数据的导入工作。
说明:本例子中提供的只是一种思路,下面的code并不能与你实际工作环境一致,如果你要使用,要对下列code略做修改。
数据表导入
--功能:数据库复制,将A数据库中的各个数据表内容导入到B数据库相对应的数据表。由于数据库中有的数据表结构中有自增量(主键),如果直接采用SQL Server提供的数据导入,会产生主键错误。
--所以想到了这种方法,其实它的关键点:就是判断当前要导入的数据表结构中是否有自增量,如果有,就先开启自增量,插入数据后,再关闭自增量。
--作者:XDN Kevin
--日期:2009.01.13
declare @iIdent int
declare @sName varchar(30)
declare @sSQL varchar(5000) -- sql 语句
declare @sCols varchar(2000)
declare tables Cursor
for
select name from sysobjects where xtype='u'
open tables
fetch from tables into @sName
while @@fetch_status = 0
begin
select @iIdent = ident_current(@sName)
if @iIdent is null
begin
--print @sName + '没有设计自增量'
set @sSQL = ''
set @sCols = ''
select @sSQL = 'insert into ' + @sName + '('
select @sCols = @sCols + a.name + ',' from syscolumns AS a
INNER JOIN
sysobjects AS d ON a.id = d.id AND d.xtype = 'U' AND d.status >= 0 and d.name = @sName
set @sSQL = @sSQL + @sCols + ')select ' + @sCols + ' from dbo.gpsdb.' + @sName
print @sSQL
end
else begin
--print @sName + '设计了自增量'
set @sSQL = 'set identity_insert ' + @sName + ' on'
select @sSQL = 'insert into ' + @sName + '('
select @sCols = @sCols + a.name + ',' from syscolumns AS a
INNER JOIN
sysobjects AS d ON a.id = d.id AND d.xtype = 'U' AND d.status >= 0 and d.name = @sName
set @sSQL = @sSQL + @sCols + ')select ' + @sCols + ' from dbo.gpsdb.' + @sName
set @sSQL = @sSQL + 'set identity_insert ' + @sName + ' off'
print @sSQL
end
fetch next from tables into @sName
end
close tables
deallocate tables