为sql数据库表数据生成insert脚本

为sql数据库表数据生成insert脚本

2023年7月13日发(作者:)

为sql server 数据库表数据生成insert 脚本

使用SQL Server 自带的“生成SQL脚本”工具,可以生成创建表、视图、存储过程等的SQL脚本。那么,能否将表中的数据也生成为SQL脚本,在查询分析器中执行这些脚本后自动将数据导入到SQL Server中呢?答案是肯定的,网上收集资料如下:

CREATE PROCEDURE Data

@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 @tablename + '对象不存在'

return

end

set @objectname=rtrim(object_name(@objectId))

if @objectname is null or charindex(@objectname,@tablename)=0

begin

print @tablename + '对象不在当前数据库中'

return

end

if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判断对象是否是表

begin

print @tablename + '对象不是表'

return

end

select @ident=status&0x80 from syscolumns where id=@objectidstatus&0x80=0x80

if @ident is not null

print 'SET IDENTITY_INSERT '+ @TableName + ' ON'

--定义游标,循环取数据并生成Insert语句

declare syscolumns_cursor cursor for

select , from syscolumns c

where =@objectid

order by

--打开游标

and

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

'''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime

then

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'

调用时 exec OutputData 'myuser' 其中myUser中当前数据库中存在的表。

另外方丈的:

drop proc proc_insert

go

create proc proc_insert (@tablename varchar(256))

as

begin

set nocount on

declare @sqlstr varchar(4000)

declare @sqlstr1 varchar(4000)

declare @sqlstr2 varchar(4000)

select @sqlstr='select ''insert '+@tablename

select @sqlstr1=''

select @sqlstr2=' ('

select @sqlstr1= ' values ( ''+'

select @sqlstr1=@sqlstr1+col+'+'',''+' ,@sqlstr2=@sqlstr2+name +',' from (select case

-- when =173 then 'case when '++' is null then ''NULL'' else

'+'convert(varchar('+convert(varchar(4),*2+2)+'),'+ +')'+' end'

when =104 then 'case when '++' is null then ''NULL'' else '+'convert(varchar(1),'+

+')'+' end'

when =175 then 'case when '++' is null then ''NULL'' else

'+'''''''''+'+'replace('++','''''''','''''''''''')' + '+'''''''''+' end'

when =61 then 'case when '++' is null then ''NULL'' else

'+'''''''''+'+'convert(varchar(23),'+ +',121)'+ '+'''''''''+' end'

when =106 then 'case when '++' is null then ''NULL'' else

'+'convert(varchar('+convert(varchar(4),+2)+'),'+ +')'+' end'

when =62 then 'case when '++' is null then ''NULL'' else '+'convert(varchar(23),'+

+',2)'+' end'

when =56 then 'case when '++' is null then ''NULL'' else '+'convert(varchar(11),'+

+')'+' end'

when =60 then 'case when '++' is null then ''NULL'' else '+'convert(varchar(22),'+

+')'+' end'

when =239 then 'case when '++' is null then ''NULL'' else

'+'''''''''+'+'replace('++','''''''','''''''''''')' + '+'''''''''+' end'

when =108 then 'case when '++' is null then ''NULL'' else

'+'convert(varchar('+convert(varchar(4),+2)+'),'+ +')'+' end'

when =231 then 'case when '++' is null then ''NULL'' else

'+'''''''''+'+'replace('++','''''''','''''''''''')' + '+'''''''''+' end' when =59 then 'case when '++' is null then ''NULL'' else '+'convert(varchar(23),'+

+',2)'+' end'

when =58 then 'case when '++' is null then ''NULL'' else

'+'''''''''+'+'convert(varchar(23),'+ +',121)'+ '+'''''''''+' end'

when =52 then 'case when '++' is null then ''NULL'' else '+'convert(varchar(12),'+

+')'+' end'

when =122 then 'case when '++' is null then ''NULL'' else

'+'convert(varchar(22),'+ +')'+' end'

when =48 then 'case when '++' is null then ''NULL'' else '+'convert(varchar(6),'+

+')'+' end'

-- when =165 then 'case when '++' is null then ''NULL'' else

'+'convert(varchar('+convert(varchar(4),*2+2)+'),'+ +')'+' end'

when =167 then 'case when '++' is null then ''NULL'' else

'+'''''''''+'+'replace('++','''''''','''''''''''')' + '+'''''''''+' end'

else '''NULL'''

end as col,,

from syscolumns a where = object_id(@tablename) and <>189 and <>34 and

<>35 and <>36

)t order by colid

select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+') '+left(@sqlstr1,len(@sqlstr1)-3)+')'' from

'+@tablename

-- print @sqlstr

exec( @sqlstr)

set nocount off

end

go

drop proc proc_insert

go

create proc proc_insert (@tablename varchar(256))

as

begin

set nocount on

declare @sqlstr varchar(4000)

declare @sqlstr1 varchar(4000)

declare @sqlstr2 varchar(4000)

select @sqlstr=select insert +@tablename

select @sqlstr1=

select @sqlstr2= (

select @sqlstr1= values ( +

select @sqlstr1=@sqlstr1+col++,+ ,@sqlstr2=@sqlstr2+name +, from (select case

-- when =173 then case when ++ is null then null else

+convert(varchar(+convert(varchar(4),*2+2)+),+ +)+ end when =104 then case when ++ is null then null else +convert(varchar(1),+ +)+

end

when =175 then case when ++ is null then null else +++replace(++,,) + ++ end

when =61 then case when ++ is null then null else +++convert(varchar(23),+

+,121)+ ++ end

when =106 then case when ++ is null then null else

+convert(varchar(+convert(varchar(4),+2)+),+ +)+ end

when =62 then case when ++ is null then null else +convert(varchar(23),+ +,2)+

end

when =56 then case when ++ is null then null else +convert(varchar(11),+ +)+

end

when =60 then case when ++ is null then null else +convert(varchar(22),+ +)+

end

when =239 then case when ++ is null then null else +++replace(++,,) + ++ end

when =108 then case when ++ is null then null else

+convert(varchar(+convert(varchar(4),+2)+),+ +)+ end

when =231 then case when ++ is null then null else +++replace(++,,) + ++ end

when =59 then case when ++ is null then null else +convert(varchar(23),+ +,2)+

end

when =58 then case when ++ is null then null else +++convert(varchar(23),+

+,121)+ ++ end

when =52 then case when ++ is null then null else +convert(varchar(12),+ +)+

end

when =122 then case when ++ is null then null else +convert(varchar(22),+ +)+

end

when =48 then case when ++ is null then null else +convert(varchar(6),+ +)+ end

-- when =165 then case when ++ is null then null else

+convert(varchar(+convert(varchar(4),*2+2)+),+ +)+ end

when =167 then case when ++ is null then null else +++replace(++,,) + ++ end

else null

end as col,,

from syscolumns a where = object_id(@tablename) and <>189 and <>34 and

<>35 and <>36

)t order by colid

select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+) +left(@sqlstr1,len(@sqlstr1)-3)+) from

+@tablename

-- print @sqlstr

exec( @sqlstr)

set nocount off

end

go

---------------------------------------------------------------------------------------

小干部的:

create proc spgeninsertsql

@tablename as varchar(100)

as

--declare @tablename varchar(100)

--set @tablename = orders

--set @tablename = eeducation

declare xcursor cursor for

select name,xusertype

from syscolumns

where (id = object_id(@tablename))

declare @f1 varchar(100)

declare @f2 integer

declare @sql varchar(8000)

set @sql =select insert into + @tablename + values(

open xcursor

fetch xcursor into @f1,@f2

while @@fetch_status = 0

begin

set @sql =@sql +

+ case when @f2 in (35,58,99,167,175,231,239,61) then + case when + @f1 + is null then else end +

else + end

+ replace(isnull(cast( + @f1 + as varchar),null),,)

+ case when @f2 in (35,58,99,167,175,231,239,61) then + case when + @f1 + is null then else end +

else + end

+ char(13) + ,

fetch next from xcursor into @f1,@f2

end

close xcursor

deallocate xcursor

set @sql = left(@sql,len(@sql) - 5) + + ) from + @tablename

print @sql

exec (@sql)

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689244911a225562.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信