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