zoukankan      html  css  js  c++  java
  • 从数据库中获取Insert语句

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

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

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

        两种方式存在的问题:

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

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

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

    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 = '同意'

    结果:略


     



    (全文完)


    以下为广告部分

    您部署的HTTPS网站安全吗?

    如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

    SSL检测评估

    快速了解HTTPS网站安全情况。

    安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

    SSL证书工具

    安装部署SSL证书变得更方便。

    SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

    SSL漏洞检测

    让服务器远离SSL证书漏洞侵扰

    TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

    作者:朱祁林 出处:http://zhuqil.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。  
  • 相关阅读:
    传递闭包+求概率——列项相消法lightoj1321好题
    TSP+期望——lightoj1287记忆化搜索,好题!
    高斯消元+期望dp——light1151
    异或前缀和,组合数学——cf1054D
    数论GCD——cf1055C
    字符串哈希——1056E
    区间dp——cf1025D二叉搜索树的中序遍历好题!
    集合划分——cf1028D思维题
    线性dp——求01串最大连续个数不超过k的方案数,cf1027E 好题!
    java_and_tomcat_set_environment
  • 原文地址:https://www.cnblogs.com/zhuqil/p/2184904.html
Copyright © 2011-2022 走看看