SQL Server 生成Insert脚本的实现(存储过程)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | /* 功能: 生成指定数据的insert 脚本 作者:一笑 日期:2022.6.15 修改: */ ALTER Proc [dbo].[P_GetInsertScripts]( @TmpTableName varchar (100), -- 临时表名 @SrcTableName varchar (100) -- 导出数据的表名 ) as begin SET NOCOUNT ON -- 临时表Id declare @ObjId int = ( select top 1 id from tempdb..sysobjects where xtype = 'U' and name like @TmpTableName + '%' ); declare @SqlText nvarchar( max ) = '' ; declare @FiledNames varchar (8000) = '' ; -- 新增的字段 -- 列名游标 declare C_Column cursor for select t. name as ColName, a. name as ColType from tempdb..syscolumns t inner join systypes a on t.xtype = a.xusertype where id = @ObjId order by colid declare @ColName varchar (100), @ColType varchar (100); open C_Column; fetch next from C_Column into @ColName,@ColType; while @@FETCH_STATUS = 0 begin set @FiledNames += @ColName+ ',' ; --拼接查询SQL if (@ColType in ( 'int' , 'decimal' , 'bit' )) begin set @SqlText += '' '' '+Cast(' +@ColName+ ' as varchar(1000))+' ',' '+' end else begin set @SqlText += '' '' '' '' '+IsNull(Cast(' +@ColName+ ' as varchar(1000)),' '' ')+' '' '' ',' '+' end fetch next from C_Column into @ColName,@ColType end close C_Column; deallocate C_Column; -- 去除字段最后的, set @FiledNames = STUFF(@FiledNames,len(@FiledNames),1, '' ) -- 去除最后的 [,+] set @SqlText = STUFF(@SqlText,len(@SqlText)-2,3, '' '' ) -- 添加 前部分的 select ... 语句 set @SqlText = 'select ' + STUFF(@SqlText,1,1, '' 'select ' ) -- 添加后部分的 ... from 语句 set @SqlText = STUFF(@SqlText,LEN(@SqlText)-1,1, '' ' union all' ) + ' as Col from ' + @TmpTableName -- 临时脚本数据表 declare @SqlTable table (SQLText varchar (2000)) -- 插入select ... union all 脚本到临时表 insert into @SqlTable exec ( 'select * from (' + @SqlText + ') t' ) declare @SQL2 nvarchar( max ) = ( SELECT stuff(( SELECT char (10) + SQLText -- FROM @SqlTable FOR XML path( '' )), 1, 1, '' ) ) set @SQL2 = STUFF(@SQL2,LEN(@SQL2)-9,10, '' ) Print 'insert into ' +@SrcTableName + '(' + @FiledNames + ')' + char (10) + @SQL2 --exec ('drop table '+ @TmpTableName) SET NOCOUNT OFF end |
1 2 3 4 | <br><br>示例:导出 Dict_Common 表的前20行数据 select top 100 DictType,DictCode,DictValue,Remark into #TmpData from Dict_Common exec [dbo].[P_GetInsertScripts] '#TmpData' , 'Dict_Common' |
将查询的字段及数据,放到临时表 #TmpData 中
执行生成存储过程,生成Insert脚本
生成insert 脚本结果如下:
分类:
MSSQLServer
标签:
SQL
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤