/** Object:  StoredProcedure [dbo].[sp_GetInsertScript]    Script Date: 08/21/2020 14:57:38 **/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/
exec  sp_GetInsertScript ‘customer’,’ and 1=1’,’custno,custname’,1,1
if(object_id(‘sp_GetInsertScript’)>0) drop proc sp_GetInsertScript
/
ALTER proc [dbo].[sp_GetInsertScript] (
@tblname NVARCHAR(max),     —表名
@condition VARCHAR(max),        —条件
    @fixcolumns VARCHAR(max)=’’,—指定列名
    @iscreatewhere INT = 1,      —是否创建插入语句时增加where                              
    @IDENTITY_INSERT INT = 0    —默认不启用标识插入                              
)  
as  
begin  
set nocount ON
—PRINT @condition
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
    IF(@IDENTITY_INSERT = 1) SET @sqlAll = @sqlAll +  ‘ select ‘’aa—-   SET IDENTITY_INSERT  ‘+@tblname+’ ON ‘’ union ‘
    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 ‘  
    IF(isnull(@condition,’’) != ‘’) SET @sqlAll = @sqlAll +  isnull(@condition,’’)
    IF(@IDENTITY_INSERT = 1) SET @sqlAll = @sqlAll +  ‘ union select ‘’zz—-    SET IDENTITY_INSERT  ‘+@tblname+’ OFF ‘’ ‘
/ 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)
PRINT ‘总记录数:’+convert(varchar,case  when @IDENTITY_INSERT=1 then  @@rowcount - 2 else @@rowcount end)  
/ SELECT ‘SET IDENTITY_INSERT ‘+@tblname+’ ON’
SELECT ‘SET IDENTITY_INSERT ‘+@tblname+’ OFF’ /
set nocount off  
END
