将数据库中的数据转换为insert语句

CREATE PROCEDURE sp_generate_insert_script @table_list varchar(8000)='*'
--Format of @table_list:
--'tb'        --single table
--'t1,t2,t3'  --table list
--'*'         --all tables in the database
AS
--作者:pbsql
DECLARE @table_name  nvarchar(128)
DECLARE @column_list varchar(8000)
DECLARE @values_list varchar(8000)
DECLARE @sql         varchar(8000)
DECLARE @msg         varchar(8000)

CREATE TABLE #result(sql varchar(8000))

IF @table_list='*'
BEGIN
  SELECT @table_list=@table_list+','+name
    FROM sysobjects
    WHERE xtype='U' AND name<>N'dtproperties'
  SET @table_list=STUFF(@table_list,1,2,'')
END

WHILE @table_list<>''
BEGIN
  IF CHARINDEX(',',@table_list)>0
    SELECT @table_name=LEFT(@table_list,CHARINDEX(',',@table_list)-1),
           @table_list=STUFF(@table_list,1,CHARINDEX(',',@table_list),'')
  ELSE
    SELECT @table_name=@table_list,
           @table_list=''

  IF EXISTS(SELECT 1 FROM sysobjects WHERE xtype='U' AND name=@table_name)
  BEGIN
    SELECT @column_list='',@values_list=''
    SELECT
      @column_list=@column_list+','+name,
      @values_list=@values_list+'+'',''+'+
        CASE WHEN xtype IN(175,167,36) THEN--char,varchar,uniqueidentifier
          'ISNULL(''''''''+REPLACE('+name+','''''''','''''''''''')+'''''''',''NULL'')'
             WHEN xtype in(239,231) THEN--nchar,nvarchar
          'ISNULL(''N''''''+REPLACE('+name+','''''''','''''''''''')+'''''''',''NULL'')'
             WHEN xtype in(61,58) THEN--datetime,smalldatetime
          'ISNULL(''''''''+CONVERT(char(23),'+name+',121)+'''''''',''NULL'')'
             ELSE--digital
          'ISNULL(CONVERT(varchar(20),'+name+'),''NULL'')'
        END
      FROM (SELECT a.name,a.xtype
              FROM syscolumns a,sysobjects b
              WHERE b.xtype='U' AND b.name=@table_name AND a.id=b.id
                AND a.xtype NOT IN(173,165,34,35,99,98,189)
              --NOT binary,varbinary,image,text,ntext,sql_variant,timestamp
           )t

    SELECT @column_list=STUFF(@column_list,1,1,''),
           @values_list=STUFF(@values_list,1,4,''),
           @sql='SELECT ''INSERT INTO '+@table_name+'('+@column_list+')'
               +' VALUES('''+@values_list+'+'')'' sql FROM ['+@table_name+']'

    IF OBJECTPROPERTY(OBJECT_ID(@table_name),'TableHasIdentity')=1
      INSERT INTO #result(sql)
      EXEC('SELECT ''--Table Name: '+@table_name+''' sql UNION ALL '
          +'SELECT ''SET IDENTITY_INSERT '+@table_name+' ON '' sql UNION ALL '
          +@sql+' UNION ALL '
          +'SELECT ''SET IDENTITY_INSERT '+@table_name+ ' OFF '' sql')
    ELSE
      INSERT INTO #result(sql)
      EXEC('SELECT ''--Table Name: '+@table_name+''' sql UNION ALL '+@sql)
  END
  ELSE
  BEGIN
    SET @msg='Can''t generate the insert script of the table '''+@table_name
            +''', because it does not exist in the system catalog.'
    DROP TABLE #result
    RAISERROR(@msg,16,1)
    RETURN
  END
END
SELECT sql FROM #result
DROP TABLE #result
GO

调用格式举例:
sp_generate_insert_script 'tb'--转换表tb中的数据
sp_generate_insert_script 't1,t2,t3'--转换表t1,t2,t3中的数据
sp_generate_insert_script '*'--转换所有表中的数据

优点:
1.支持三种参数格式,调用方便
2.支持标识列的导出
3.将结果放在一个结果集中,方便拷贝

缺点:
1.不支持以下类型:binary,varbinary,image,text,ntext,sql_variant,timestamp
2.由于受SQL SERVER字符串长度影响(8000B),若表中字段过多或表中数据过长会被截断而出错,但一般的需求可以满足,最大可以支持每表100个字段左右,每条记录最大支持为6-7KB(视字段多少及字段名称长度而定)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值