关于sqlserver的自动生成包含数据的insert脚本问题

版权声明:本文为博主原创文章,欢迎大家疯狂转载。 https://blog.csdn.net/lingxyd_0/article/details/51526028

关于sqlserver的自动生成包含数据的insert脚本问题

最近在一个项目上,需要数据的增量导入。项目上用的是sqlserver数据库。好久没有直接sql语句操作数据库了。感觉有点手生了可怜

解决此问题的方案有很多。可以直接从数据库层面来解决。

1、如果刚上线的项目,可以直接将整个数据库还原或者赋值出来附加上即可。

2、如果只需要单个表也可以通过sqlserver客户端的导入导出来完成。如果牵扯到关联表中的ID,也许需要将原始ID也插入。

3、如果针对已经上线的项目,需要导入部分数据就稍微麻烦点了。针对项目上没有多少需要导入的数据,本来想通过生成insert语句脚本来将数据导入。


sqlserver提供的是单独的导入导出程序来操作。而且数据脚本隐藏比较深。操作也不方便。相对来说,有很多客户端都可以做到比较友好的操作即可实现此功能。比如:Navicat 提供的客户端。直接可以将表连同数据一起复制到其他数据库中。操作非常简单。需要生成insert语句脚本也很简单。在需要复制的数据上直接右键,复制为--insert语句即可。而且可以选择多条数据。



但是这样还是不能满足需要,因为表结构不相同怎么办?我不想复制ID列怎么办?或者说我只是为了指定条件的数据导出怎么办?别急还是有办法的

Navicat 同样提供了sql语句查询编辑器,在这里可以直接输入sql语句指定列,指定筛选条件的来筛选数据。这样在结果上再复制出insert语句就是指定的字段和指定的筛选条件了。




目前我用的这个版本的客户端,这样复制出来的语句中表名是“ .. ” ,不知道是不是客户端的bug。

INSERT INTO .. ([OrderID], [A2601], [A2602], [A2603]) VALUES ('1000', N'sdxtcyj', N'645A807DF642FDDDB3CB3FFC3DC9E55C', N'xtcyj@163.com');
INSERT INTO .. ([OrderID], [A2601], [A2602], [A2603]) VALUES ('1000', N'ouczyw', N'2F83257B1B98B613D4C1DD74C88C4BA4', N'ouczyw@163.com');

我自己手动替换一下表名就可以了。


4、 如果我们直接使用sqlserver提供的客户端做这个事情,到底能不能做?该怎么做? (不通过导入导出,只是为了单独复制几条数据)

肯定能做啊,只是稍微麻烦点了,需要自己写的东西比较多。可以自己生成insert语句,网上也有现成的存储过程,可以再丰富完善一下即可。如:

CREATE       PROCEDURE   dbo.UspOutputData   
  @tablename   sysname   
  AS   
  declare   @column   varchar(1000)   
  declare   @columndata   varchar(1000)   
  declare   @sql   varchar(4000)   
  declare   @xtype   tinyint   
  declare   @name   sysname   
  declare   @objectId   int   
  declare   @objectname   sysname   
  declare   @ident   int   
    
  set   nocount   on   
  set   @objectId=object_id(@tablename)   
    
  if   @objectId   is   null   --   判斷對象是否存在     
  begin     
  print   'The   object   not   exists'     
  return     
  end     
  set     @objectname=object_name(@objectId)   
    
  if     @objectname   is   null   or   charindex(@objectname,@tablename)=0   --此判断不严密   
  begin   
  print   'object   not   in   current   database'   
  return   
  end   
    
  if   OBJECTPROPERTY(@objectId,'IsTable')   <>   1   --   判斷對象是否是table     
  begin     
  print   'The   object   is   not   table'     
  return     
  end     
    
  select   @ident=status&0x80     from   syscolumns   where   id=@objectid   and   status&0x80=0x80   
    
  if   @ident   is   not   null   
  print   'SET   IDENTITY_INSERT   '+@TableName+'   ON'   
    
  declare   syscolumns_cursor   cursor     
  for   select   c.name,c.xtype   from   syscolumns   c   
  where   c.id=@objectid   
  order   by   c.colid   
  open   syscolumns_cursor   
  set   @column=''   
  set   @columndata=''   
  fetch   next   from   syscolumns_cursor   into   @name,@xtype   
  while   @@fetch_status   <>-1   
  begin   
  if   @@fetch_status<>-2   
  begin   
  if   @xtype   not   in(189,34,35,99,98)   --timestamp不需处理,image,text,ntext,sql_variant   暂时不处理   
  begin   
  set   @column=@column+case   when   len(@column)=0   then''   else   ','end+@name   
  set   @columndata=@columndata+case   when   len(@columndata)=0   then   ''   else   ','','','end   
  +case   when   @xtype   in(167,175)   then   '''''''''+'+@name+'+'''''''''   --varchar,char   
  when   @xtype   in(231,239)   then   '''N''''''+'+@name+'+'''''''''   --nvarchar,nchar   
  when   @xtype=61   then   '''''''''+convert(char(23),'+@name+',121)+'''''''''   --datetime   
  when   @xtype=58   then   '''''''''+convert(char(16),'+@name+',120)+'''''''''   --smalldatetime   
  when   @xtype=36   then   '''''''''+convert(char(36),'+@name+')+'''''''''   --uniqueidentifier   
  else   @name   end   
  end   
  end       
  fetch   next   from   syscolumns_cursor   into   @name,@xtype   
  end   
  close   syscolumns_cursor   
  deallocate   syscolumns_cursor   
    
  set   @sql='set   nocount   on   select   ''insert   '+@tablename+'('+@column+')   values(''as   ''--'','+@columndata+','')''   from   '+@tablename   
    
  print   '--'+@sql   
  exec(@sql)   
    
  if   @ident   is   not   null   
  print   'SET   IDENTITY_INSERT   '+@TableName+'   OFF'   
    
  GO 

执行一下查看结果:

exec   UspOutputData  A026A001

直接复制数据放到查询分析器中即可







阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页