您的位置:首页 > 数据库

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

2016-05-28 18:43 851 查看
关于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


直接复制数据放到查询分析器中即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息