黄聪:SQL Server 开发之 复制表数据的SQL脚本生成器

 SQL Server 开发之 复制表数据的SQL脚本生成器收藏

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

下面的存储过程是一位高人写的,这位高人的姓氏已无人知晓,但SQL Server社区中偶尔还可看到此不朽之作。

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
CREATE PROCEDURE dbo.OutputData
@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 = @objectid and status & 0x80 = 0x80

if @ident is not null
print ' SET IDENTITY_INSERT ' + @TableName + ' ON '



-- 定义游标,循环取数据并生成Insert语句
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 '

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

   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值