zoukankan      html  css  js  c++  java
  • MSSQL中把表中的数据导出成Insert

    use master
    go
    if exists (select name from sysobjects where name = 'sp_generate_insert_script')
    begin
      drop proc sp_generate_insert_script
      print 'old version of sp_generate_insert_script dropped'
    end
    go
    create procedure sp_generate_insert_script
                     @tablename_mask varchar(30) = NULL
    as
    begin
      declare @tablename       varchar (128)
      declare @tablename_max   varchar (128)
      declare @tableid         int
      declare @columncount     numeric (7,0)
      declare @columncount_max numeric (7,0)
      declare @columnname      varchar (30)
      declare @columntype      int
      declare @string          varchar (30)
      declare @leftpart        varchar (8000)   
      declare @rightpart       varchar (8000)   
      declare @hasident        int
      set nocount on
      -- take ALL tables when no mask is given (!)
      if (@tablename_mask is NULL)
      begin
        select @tablename_mask = '%'
      end
      -- create table columninfo now, because it will be used several times
      create table #columninfo
      (num      numeric (7,0) identity,
       name     varchar(30),
       usertype smallint)
    
      select name,
             id
        into #tablenames
        from sysobjects
       where type in ('U' ,'S')
         and name like @tablename_mask
      -- loop through the table #tablenames
      select @tablename_max  = MAX (name),
             @tablename      = MIN (name)
        from #tablenames
      while @tablename <= @tablename_max
      begin
        select @tableid   = id
          from #tablenames
         where name = @tablename
        if (@@rowcount <> 0)
        begin
          -- Find out whether the table contains an identity column
          select @hasident = max( status & 0x80 )
            from syscolumns
           where id = @tableid
          truncate table #columninfo
          insert into #columninfo (name,usertype)
          select name, type
            from syscolumns C
           where id = @tableid
             and type <> 37            -- do not include timestamps
          -- Fill @leftpart with the first part of the desired insert-statement, with the fieldnames
          select @leftpart = 'select ''insert into '+@tablename
          select @leftpart = @leftpart + '('
          select @columncount     = MIN (num),
                 @columncount_max = MAX (num)
            from #columninfo
          while @columncount <= @columncount_max
          begin
            select @columnname = name,
                   @columntype = usertype
              from #columninfo
             where num = @columncount
            if (@@rowcount <> 0)
            begin
              if (@columncount < @columncount_max)
              begin
                select @leftpart = @leftpart + @columnname + ','
              end
              else
              begin
                select @leftpart = @leftpart + @columnname + ')'
              end
            end
            select @columncount = @columncount + 1
          end
          select @leftpart = @leftpart + ' values('''
          -- Now fill @rightpart with the statement to retrieve the values of the fields, correctly formatted
          select @columncount     = MIN (num),
                 @columncount_max = MAX (num)
            from #columninfo
          select @rightpart = ''
          while @columncount <= @columncount_max
          begin
            select @columnname = name,
                   @columntype = usertype
              from #columninfo
             where num = @columncount
            if (@@rowcount <> 0)
            begin
              if @columntype in (39,47)
              begin
                select @rightpart = @rightpart + '+'
                select @rightpart = @rightpart + 'ISNULL(' + replicate( char(39), 4 ) + '+replace(' + @columnname + ',' +
    replicate( char(39), 4 ) + ',' + replicate( char(39), 6) + ')+' + replicate( char(39), 4 ) + ',''NULL'')'
              end
              else if @columntype = 35
                                      
              begin
                select @rightpart = @rightpart + '+'
                select @rightpart = @rightpart + 'ISNULL(' + replicate( char(39), 4 ) + '+replace(convert(varchar(1000),' +
    @columnname + ')' + ',' + replicate( char(39), 4 ) + ',' + replicate( char(39), 6 ) + ')+' + replicate( char(39), 4 ) +
    ',''NULL'')'
              end
              else if @columntype in (58,61,111)
              begin
                select @rightpart = @rightpart + '+'
                select @rightpart = @rightpart + 'ISNULL(' + replicate( char(39), 4 ) + '+convert(varchar(20),' + @columnname +
    ')+'+ replicate( char(39), 4 ) + ',''NULL'')'
              end
              else  
              begin
                select @rightpart = @rightpart + '+'
                select @rightpart = @rightpart + 'ISNULL(convert(varchar(99),' + @columnname + '),''NULL'')'
              end
    
              if ( @columncount < @columncount_max)
              begin
                select @rightpart = @rightpart + '+'','''
              end
            end
            select @columncount = @columncount + 1
          end
        end
        select @rightpart = @rightpart + '+'')''' + ' from ' + @tablename
        -- Order the select-statements by the first column so you have the same order for
        -- different database (easy for comparisons between databases with different creation orders)
        select @rightpart = @rightpart + ' order by 1'
        -- For tables which contain an identity column we turn identity_insert on
        -- so we get exactly the same content
        if @hasident > 0
           select 'SET IDENTITY_INSERT ' + @tablename + ' ON'
        exec ( @leftpart + @rightpart )
        if @hasident > 0
           select 'SET IDENTITY_INSERT ' + @tablename + ' OFF'
        select @tablename      = MIN (name)
          from #tablenames
         where name            > @tablename
      end
    end
    

    再选择要导出语句的数据库,在“查询”中选择“结果保存为文件……”,执行EXEC sp_generate_insert_script '表名',如果不写表名,将

    导出数据库中所有的表的内容。保存的文件即为Insert的SQL语句。

  • 相关阅读:
    7-4
    7-3
    第五章例5-2
    第五章例5-1
    第四章例4-12
    第四章例4-11
    第四章例4-10
    第四章例4-9
    第四章例4-8
    第四章例4-7
  • 原文地址:https://www.cnblogs.com/webwang/p/mssqltoinsert.html
Copyright © 2011-2022 走看看