首页 > 数据库 > SQL Server > 正文

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

2024-08-31 00:49:16
字体:
来源:转载
供稿:网友

商业源码热门下载www.html.org.cn

使用sql server 2000自带的“生成sql脚本”工具,可以生成创建表、视图、存储过程等的sql脚本。那么,能否将表中的数据也生成为sql脚本,在查询分析器中执行这些脚本后自动将数据导入到sql server中呢?答案是肯定的。
下面的存储过程是一位高人写的,这位高人的姓氏已无人知晓,但sql server社区中偶尔还可看到此不朽之作。
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   [email protected]   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   [email protected]     
      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   @[email protected] + 
          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   '''''''''+'[email protected]+'+'''''''''                --varchar,char     
                 when   @xtype   in(231,239)   then   '''n''''''+'[email protected]+'+'''''''''             --nvarchar,nchar     
                 when   @xtype=61   then   '''''''''+convert(char(23),'[email protected]+',121)+'''''''''   --datetime     
                 when   @xtype=58   then   '''''''''+convert(char(16),'[email protected]+',120)+'''''''''   --smalldatetime     
                  when   @xtype=36   then   '''''''''+convert(char(36),'[email protected]+')+'''''''''       --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   '[email protected]+'('[email protected]+')   values(''as   ''--'','[email protected]+','')''   from   '[email protected]        
  print   '--'[email protected]     
  exec(@sql)         
  if   @ident   is   not   null      
  print  'set   identity_insert   '[email protected]+'   off'    
调用时 exec   outputdata   'myuser' 其中myuser中当前数据库中存在的表
   
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表