研究生成SQL脚本

本文介绍了一种使用SQL脚本动态生成批量插入语句的方法。通过存储过程解析传入的表名列表,并针对每张表创建对应的INSERT语句。该方法支持多种数据类型,并考虑了标识字段的处理。

IF   OBJECT_ID('DataAsInsCommand')   IS   NOT   NULL   DROP   PROC   DataAsInsCommand  
  GO  
  SET   QUOTED_IDENTIFIER   OFF  
  GO  
  CREATE   PROC   DataAsInsCommand   (  
      @TableList   varchar   (200))  
  AS  
  SET   NOCOUNT   ON  
  DECLARE   @position   int,   @exec_str   varchar   (2000),   @TableName   varchar   (30)  
  DECLARE   @name   varchar(128),   @xtype   int,   @status   tinyint,   @IsIdentity   tinyint  
  SELECT   @TableList   =   @TableList   +   ','  
  SELECT   @IsIdentity   =   0  
  SELECT   @position   =   PATINDEX('%,%',   @TableList)  
  WHILE   (@position   <>   0)  
      BEGIN  
          SELECT   @TableName   =   SUBSTRING(@TableList,   1,   @position   -   1)  
          SELECT   @TableList   =   STUFF(@TableList,   1,   PATINDEX('%,%',   @TableList),   '')  
          SELECT   @position   =   PATINDEX('%,%',   @TableList)  
   
          SELECT   @exec_str   =   'DECLARE   fetch_cursor   CURSOR   FOR   '    
              +   'SELECT   name,   xtype,   status   FROM   syscolumns   WHERE   id   =   object_id("'    
              +   @TableName   +   '")'  
          EXEC   (@exec_str)  
   
          OPEN   fetch_cursor  
          FETCH   fetch_cursor   INTO   @name,   @xtype,   @status  
          IF   (@status   &   0x80)   <>   0    
              BEGIN  
                  SELECT   @IsIdentity   =   1  
                  SELECT   'SET   IDENTITY_INSERT   '   +   @TableName   +   '   ON'  
                  SELECT   'GO'  
              END  
          SELECT   @exec_str   =   "SELECT   'INSERT   INTO   "   +   @TableName   +   "   VALUES   ('   +   "  
   
          --text   or   ntext  
          IF   (@xtype   =   35)   OR   (@xtype   =   99)  
                  SELECT   @exec_str   =   @exec_str   +   '''"None   yet"'''  
          ELSE  
   
          --image  
          IF   (@xtype   =   34)  
                  SELECT   @exec_str   =   @exec_str   +   '"'   +   '0xFFFFFFFF'   +   '"'  
          ELSE  
   
          --smalldatetime   or   datetime  
          IF   (@xtype   =   58)   OR   (@xtype   =   61)  
                  SELECT   @exec_str   =   @exec_str   +   '   +   ''"''   +   '   +   '   +   CONVERT(varchar,'   +   @name   +   ',101)'   +   '   +   ''"'''  
          ELSE  
   
          --varchar   or   char   or   nvarchar   or   nchar  
          IF   (@xtype   =   167)   OR   (@xtype   =   175)   OR   (@xtype   =   231)   OR   (@xtype   =   239)  
                  SELECT   @exec_str   =   @exec_str   +   '''"''   +   '   +   @name   +   '   +   ''"'''  
          ELSE  
   
          --uniqueidentifier  
          IF   (@xtype   =   36)  
                  SELECT   @exec_str   =   @exec_str   +   '   +   ''"''   +   '   +   '   +   CONVERT(varchar(255),'   +   @name   +   ')'   +   '   +   ''"'''  
          ELSE  
   
          --binary   or   varbinary  
          IF   (@xtype   =   173)   OR   (@xtype   =   165)  
                  SELECT   @exec_str   =   @exec_str   +   '"'   +   '0x0'   +   '"'  
          ELSE  
   
                  SELECT   @exec_str   =   @exec_str   +   'ISNULL(CONVERT(varchar,'   +   @name   +   '),   "null")'  
   
          WHILE   @@FETCH_STATUS   <>   -1    
              BEGIN  
                  FETCH   fetch_cursor   INTO   @name,   @xtype,   @status  
                  IF   (@@FETCH_STATUS   =   -1)   BREAK  
                  IF   (@status   &   0x80)   <>   0    
                      BEGIN  
                          SELECT   @IsIdentity   =   1  
                          SELECT   'SET   IDENTITY_INSERT   '   +   @TableName   +   '   ON'  
                          SELECT   'GO'  
                      END  
   
                  --text   or   ntext  
                  IF   (@xtype   =   35)   OR   (@xtype   =   99)  
                        SELECT   @exec_str   =   @exec_str   +   '   +   '','''   +   '   +   ''"None   yet"'''  
                  ELSE  
   
                  --image  
                  IF   (@xtype   =   34)  
                        SELECT   @exec_str   =   @exec_str   +   '   +   ","   +   '   +   '"'   +   '0xFFFFFFFF'   +   '"'  
                  ELSE  
   
                  --smalldatetime   or   datetime  
                  IF   (@xtype   =   58)   OR   (@xtype   =   61)  
                        SELECT   @exec_str   =   @exec_str   +   '   +   ","'   +   '   +   ''"''   +   '   +   '   +   CONVERT(varchar,'   +   @name   +   ',101)'   +   '   +   ''"'''  
                  ELSE  
   
                  --varchar   or   char   or   nvarchar   or   nchar  
                  IF   (@xtype   =   167)   OR   (@xtype   =   175)   OR   (@xtype   =   231)   OR   (@xtype   =   239)  
                        SELECT   @exec_str   =   @exec_str   +   '   +   '','''   +   '   +   ''"''   +   '   +   @name   +   '   +   ''"'''  
                  ELSE  
   
                  --uniqueidentifier  
                  IF   (@xtype   =   36)  
                        SELECT   @exec_str   =   @exec_str   +   '   +   ","'   +   '   +   ''"''   +   '   +   '   +   CONVERT(varchar(255),'   +   @name   +   ')'   +   '   +   ''"'''  
                  ELSE  
   
                  --binary   or   varbinary  
                  IF   (@xtype   =   173)   OR   (@xtype   =   165)  
                        SELECT   @exec_str   =   @exec_str   +   '   +   ","   +   '   +   '"'   +   '0x0'   +   '"'  
                  ELSE  
   
                        SELECT   @exec_str   =   @exec_str   +   '   +   ","'   +   '   +   ISNULL(CONVERT(varchar,'   +   @name   +   '),   "null")'  
              END    
   
          CLOSE   fetch_cursor  
          DEALLOCATE   fetch_cursor  
   
          SELECT   @exec_str   =   @exec_str   +   '+   ")"   FROM   '   +   @TableName    
          SELECT   @exec_str  
          EXEC(@exec_str)  
          SELECT   'GO'  
   
          IF   @IsIdentity   =   1  
                BEGIN  
                    SELECT   @IsIdentity   =   0  
                    SELECT   'SET   IDENTITY_INSERT   '   +   @TableName   +   '   OFF'  
                    SELECT   'GO'  
                END  
      END  
  GO  
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值