博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从数据库中获取Insert语句
阅读量:7238 次
发布时间:2019-06-29

本文共 3666 字,大约阅读时间需要 12 分钟。

经常需要从开发库中提交生成数据的sql到测试库中。之前采用的方式:

    1、自己写sql,将sql保存起来,等测试的时候提交这些sql。

    2、在ERP系统中添加数据使用SQL SERVER Profiler跟踪SQL,保存起来,等测试的时候提交这些sql。

    两种方式存在的问题:

    1、如果修改一些数据,必须将更新语句也保存起来。

    2、保存的sql如果没有很好的管理机制,容易丢失。

     所以,在网上找了一下,写了一个根据数据库表名称和过滤条件生成insert的语句的存储过程,当提交测试的时候根据这个存储过程产生insert语句就行了。主要代码来自: 。我根据业务需求做了相应的调整,代码如下:

SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO drop   PROC InsertGenerator go CREATE PROC InsertGenerator ( @tableName varchar(100), @filterCondition varchar(100) ) as --定义一个游标获取数据表列的相关信息 DECLARE cursCol CURSOR FAST_FORWARD FOR SELECT column_name,data_type FROM information_schema.columns WHERE table_name = @tableName OPEN cursCol DECLARE @string nvarchar(3000) --存放insert语句的前一半 DECLARE @stringData nvarchar(3000) --存放 (VALUES) DECLARE @dataType nvarchar(1000) --列的数据类型 SET @string='INSERT '+@tableName+'(' SET @stringData='' DECLARE @colName nvarchar(50) FETCH NEXT FROM cursCol INTO @colName,@dataType IF @@fetch_status<>0 begin print 'Table '+@tableName+' not found, processing skipped.' close curscol deallocate curscol return END WHILE @@FETCH_STATUS=0 BEGIN IF @dataType in ('varchar','char','nchar','nvarchar') BEGIN SET @stringData=@stringData+''''+'''+isnull('''''+'''''+'+@colName+'+'''''+''''',''NULL'')+'',''+' END ELSE if @dataType in ('text','ntext') --text 类型 BEGIN SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(2000)),'''')+'''''',''+' END ELSE IF @dataType = 'money' -- money 类型 BEGIN SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+' END ELSE IF @dataType='datetime'-- datetime 类型 BEGIN SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+' END ELSE IF @dataType='image'  -- image 类型 BEGIN SET @stringData=@stringData+'''''''''+isnull(cast(convert(varbinary,'+@colName+') as varchar(6)),''0'')+'''''',''+' END ELSE --   int,bit,numeric,decimal 类型 BEGIN SET @stringData=@stringData+''''+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+')+'''''+''''',''NULL'')+'',''+' END SET @string=@string+@colName+',' FETCH NEXT FROM cursCol INTO @colName,@dataType END DECLARE @Query nvarchar(4000) --设置表的过滤条件 IF @filterCondition='' OR @filterCondition IS NULL BEGIN SET @filterCondition=' 1=1 ' END SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')'' FROM '+@tableName + ' where  ' + @filterCondition PRINT @query exec sp_executesql @query CLOSE cursCol DEALLOCATE cursCol GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO

使用这个存储过程:

1、不使用过滤条件功能

InsertGenerator leave,''

得到生成insert语句的sql为:

SELECT  'INSERT leave(LeaveGUID,LeaveName,LeaveDay,Memo,Status) VALUES(' + '' + ISNULL('''' + CONVERT(VARCHAR(200), LeaveGUID) + '''', 'NULL') + ',' + '' + ISNULL('''' + LeaveName + '''', 'NULL') + ',' + '' + ISNULL('''' + CONVERT(VARCHAR(200), LeaveDay) + '''', 'NULL') + ',' + '' + ISNULL('''' + Memo + '''', 'NULL') + ',' + '' + ISNULL('''' + Status + '''', 'NULL') + '' + ')' FROM    leave WHERE   1=1

结果:

2、使用过滤添加条件功能:

InsertGenerator leave,'status=''同意'''

得到生成insert语句的sql为:

SELECT  'INSERT leave(LeaveGUID,LeaveName,LeaveDay,Memo,Status) VALUES(' + '' + ISNULL('''' + CONVERT(VARCHAR(200), LeaveGUID) + '''', 'NULL') + ',' + '' + ISNULL('''' + LeaveName + '''', 'NULL') + ',' + '' + ISNULL('''' + CONVERT(VARCHAR(200), LeaveDay) + '''', 'NULL') + ',' + '' + ISNULL('''' + Memo + '''', 'NULL') + ',' + '' + ISNULL('''' + Status + '''', 'NULL') + '' + ')' FROM    leave WHERE   status = '同意'

结果:略

本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2011/09/22/2184904.html,如需转载请自行联系原作者

你可能感兴趣的文章
[整理] 两种方法查看MFC源代码
查看>>
字符常量 java
查看>>
面试中,应聘者问面试官的问题
查看>>
用js实现翻牌的效果
查看>>
Linux 中文设置
查看>>
再写mock对象
查看>>
hg vs git :这个世界除了svn还有别的
查看>>
BZOJ1095:[ZJOI2007]Hide 捉迷藏(动态点分治)
查看>>
[LeetCode] Word Break II
查看>>
两句话解决代理问题
查看>>
熊市中,值得关注的项目都有这三大特征
查看>>
2018.12.27-dtoj-4089-line
查看>>
10:比较整数大小经典案例
查看>>
ES06--elasticsearch
查看>>
pytorch1.0 用torch script导出模型
查看>>
数据结构(九)查找
查看>>
JAVA常用的集合类
查看>>
Unity3D MainCamera和NGUI UICamera的小插曲
查看>>
gnuWin32-mini-2016.10.30
查看>>
Cassandra博客更新预告
查看>>