在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