SQL Server 開發之 複製表資料的SQL指令碼產生器

來源:互聯網
上載者:User

使用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   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中當前資料庫中存在的表

   

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.