USE [master]
GO
/** Object:  StoredProcedure [dbo].[sp_GetInsertScript]    Script Date: 02/22/2021 13:06:30 **/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— =============================================  
— Author: qzf
— Create date: 2019-9-9 16:56:41
— Description: 将表数据生成Insert脚本  
— Demo :  
/
USE msims
exec sp_GetInsertScript ‘不使用’,’customer’,’1=1’ ,’’,0,1
/
— =============================================  
ALTER proc [dbo].[sp_GetInsertScript] (
    @dbname VARCHAR(200)=’’,    —数据库名                              
    @tblname NVARCHAR(max),     —表名
    @condition VARCHAR(max),        —条件
    @fixcolumns VARCHAR(max)=’’,—指定列名
    @iscreatewhere INT = 1,      —是否创建插入语句时增加where                              
    @IDENTITY_INSERT INT = 0    —默认不启用标识插入                              
)  
as  
begin  
    set nocount ON
    declare @sqlAll varchar(max)  
    declare @sqlstr varchar(max)  
    declare @sqlColumnValueForInsert varchar(max)  
    declare @sqlColumnNameForInsert varchar(max)  
    DECLARE @primarykey VARCHAR(500) —主键
    DECLARE @rid VARCHAR(500)  —自增列
    declare @Sql nvarchar(max)    
    DECLARE @columns VARCHAR(max) —非自增的所有列逗号分隔
    DECLARE @insertWhere VARCHAR(max)
    DECLARE @usedb VARCHAR(500)
    IF(ISNULL(@fixcolumns,’’)!=’’) SET @fixcolumns = ‘,’+@fixcolumns+’,’
    —连接数据库
    set @usedb =’’— CASE isnull(@dbname,’’) WHEN ‘’ THEN ‘’ ELSE ‘ use ‘+@dbname+ ‘ ‘ END
    —获得主键————————-
    SET @primarykey = ‘’
    SET @sql =@usedb + N’ SELECT @primarykey = @primarykey+’’,’’ + name FROM syscolumns col WHERE OBJECT_NAME(id)=’’’+@tblname+’’’ AND  
    EXISTS ( SELECT   1
          FROM     dbo.sysindexes si
          INNER JOIN dbo.sysindexkeys sik ON si.id = sik.id
                  AND si.indid = sik.indid
          INNER JOIN dbo.syscolumns sc ON sc.id = sik.id
                  AND sc.colid = sik.colid
          INNER JOIN dbo.sysobjects so ON so.name = si.name
                  AND so.xtype = ‘’PK’’
          WHERE    sc.id = col.id
          AND sc.colid = col.colid )
    ORDER BY col.colid’
    EXEC sp_executesql @sql,N’@primarykey varchar(500) out’,@primarykey out                                    
    SET @primarykey = SUBSTRING(@primarykey,2,LEN(@primarykey ))
    —print @primarykey
    IF(CHARINDEX(‘,’,@primarykey)>0) set @primarykey = REPLACE(@primarykey,’,’,’+’)
    —获得自增列————————-
    —SELECT @rid = name FROM syscolumns WHERE OBJECT_NAME(id)=@tblname AND COLUMNPROPERTY(id, name, ‘IsIdentity’) = 1
    SET @sql =@usedb + N’ select @rid = name FROM syscolumns WHERE OBJECT_NAME(id)=’’’+@tblname+’’’ AND COLUMNPROPERTY(id, name, ‘’IsIdentity’’) = 1 ‘;
    EXEC sp_executesql @sql,N’@rid varchar(500) out’,@rid out      
  —PRINT @rid
    IF(@primarykey = ‘’) SET @primarykey = @rid
    IF(isnull(@primarykey,’’)=’’)  
    BEGIN
        PRINT ‘主键和自增列不能为空!’
        RETURN
    END
    —获得所有列
    SET @columns = ‘’
    —SELECT @columns = @columns+’,’+ + name  FROM syscolumns WHERE OBJECT_NAME(id)=@tblname AND COLUMNPROPERTY(id, name, ‘IsIdentity’) = 0 ORDER BY colid  
    —SET @sql =@usedb + N’ SELECT @columns = @columns+’’,’’+  name  FROM syscolumns WHERE   OBJECT_NAME(id)=’’’+@tblname+’’’ AND COLUMNPROPERTY(id, name, ‘’IsIdentity’’) = 0  ‘
    SET @sql =@usedb + N’ SELECT @columns = @columns+’’,’’+  name  FROM syscolumns WHERE   OBJECT_NAME(id)=’’’+@tblname+’’’   ‘    
    IF(isnull(@fixcolumns,’’) != ‘’)
    BEGIN
  SET @sql = @sql + ‘ and ‘’’+@fixcolumns+’’’ like ‘’%,’’+name+’’,%’’ ‘    
    END
    IF(@IDENTITY_INSERT = 0)
    BEGIN
  SET @sql = @sql + ‘ and ‘’,’+@rid+’,’’ not like ‘’%,’’+name+’’,%’’ ‘    
    END
    SET @sql = @sql + ‘ order by colid ‘
       
    —PRINT @sql    
    EXEC sp_executesql @sql,N’@columns varchar(max) out’,@columns out        
    SET @columns = SUBSTRING(@columns,2,LEN(@columns ))
    —PRINT @columns
 
   
    select @sqlstr=’select ‘’insert ‘+@tblname  
    select @sqlColumnValueForInsert=’’  
    select @sqlColumnNameForInsert=’(‘  
    —select @sqlColumnValueForInsert=’values (‘’+’  
    select @sqlColumnValueForInsert=’select ‘’+’
    SELECT @insertWhere = ‘ +’’ where not exists(select 1 from ‘+@tblname+’ where ‘+@primarykey+’ = ‘’+convert(varchar,’+@primarykey+’)+’’)’’  ‘
    select @sqlColumnValueForInsert=@sqlColumnValueForInsert+col+’+’’,’’+’ ,@sqlColumnNameForInsert=@sqlColumnNameForInsert+name +’,’  
    from (select case  
      when a.xtype =173 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =104 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =175 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’’’’’’’’’+’+’replace(‘+a.name+’,’’’’’’’’,’’’’’’’’’’’’)’ + ‘+’’’’’’’’’+’ end’  
      when a.xtype =61 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’’’’’’’’’+’+’convert(varchar,’+a.name +’,121)’+ ‘+’’’’’’’’’+’ end’  
      when a.xtype =106 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =62 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’,2)’+’ end’  
      when a.xtype =56 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =60 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =239 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’’’’’’’’’+’+’replace(‘+a.name+’,’’’’’’’’,’’’’’’’’’’’’)’ + ‘+’’’’’’’’’+’ end’  
      when a.xtype =108 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =231 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’’’’’’’’’+’+’replace(‘+a.name+’,’’’’’’’’,’’’’’’’’’’’’)’ + ‘+’’’’’’’’’+’ end’  
      when a.xtype =59 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’,2)’+’ end’  
      when a.xtype =58 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’’’’’’’’’+’+’convert(varchar,’+a.name +’,121)’+ ‘+’’’’’’’’’+’ end’  
      when a.xtype =52 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =122 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =127 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =48 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =165 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’convert(varchar,’+a.name +’)’+’ end’  
      when a.xtype =167 then ‘case when ‘+a.name+’ is null then ‘’NULL’’ else ‘+’’’’’’’’’+’+’replace(‘+a.name+’,’’’’’’’’,’’’’’’’’’’’’)’ + ‘+’’’’’’’’’+’ end’  
      else ‘’’NULL’’’  
      end as col,a.colid,a.name  
  from syscolumns a where a.id = object_id(@tblname)  
  and a.xtype <>189 and a.xtype <>34 and a.xtype <>35 and a.xtype <>36  
    )t
    WHERE 1=1 AND ‘,’+ @columns + ‘,’ LIKE ‘%,’+t.name+’,%’
    order by colid
 
    PRINT @sqlColumnValueForInsert
    —select @sqlstr=@sqlstr+left(@sqlColumnNameForInsert,len(@sqlColumnNameForInsert)-1)+’) ‘+left(@sqlColumnValueForInsert,len(@sqlColumnValueForInsert)-3)+’)’’ from ‘+@tblname + ‘ where 1=1 and ‘ + isnull(@condition,’’)  
    SET @sqlAll = ‘’;
    set @sqlAll = @sqlAll + @usedb
    set @sqlAll = @sqlAll + @sqlstr
    set @sqlAll = @sqlAll + left(@sqlColumnNameForInsert,len(@sqlColumnNameForInsert)-1)+’) ‘
    set @sqlAll = @sqlAll + left(@sqlColumnValueForInsert,len(@sqlColumnValueForInsert)-5)
    IF(@iscreatewhere = 1) set @sqlAll = @sqlAll + @insertWhere
    set @sqlAll = @sqlAll + ‘ from ‘+ @tblname + ‘ where 1=1 and ‘ + isnull(@condition,’’)
    / set @sqlstr=@sqlstr+
    left(@sqlColumnNameForInsert,len(@sqlColumnNameForInsert)-1)+’) ‘+
    left(@sqlColumnValueForInsert,len(@sqlColumnValueForInsert)-5)+
    case @iscreatewhere when 1 then @insertWhere ELSE ‘’ END +  
    ‘ from ‘+ @tblname + ‘ where 1=1 and ‘ + isnull(@condition,’’)  /
    print @sqlAll  
    exec( @sqlAll)  
    SELECT ‘SET IDENTITY_INSERT ‘+@tblname+’ ON’
    SELECT ‘SET IDENTITY_INSERT ‘+@tblname+’ OFF’
    set nocount off  
END
