You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server生产就绪插入脚本优化及通用模板咨询

如何将SQL插入脚本调整为生产就绪版本?

嗨,我来帮你把这个脚本调整成生产环境可用的版本,顺便给你一套通用的生产级SQL脚本模板参考~

先说说需要调整的几个关键点:

  • 移除WITH (NOLOCK)提示:这个提示会允许脏读,在判断记录是否存在时可能拿到不准确的结果,导致重复插入或者误操作,生产环境绝对不能用这个来做存在性校验。
  • 添加事务控制:把所有插入操作包在事务里,确保要么全部执行成功,要么全部回滚,避免出现部分插入的不一致状态。
  • 转义关键字列名:delete是SQL Server的保留关键字,作为列名时必须用方括号[delete]包裹,否则会报语法错误。
  • 增加错误处理:用TRY/CATCH块捕获异常,出现错误时自动回滚事务,还能输出错误信息方便排查。
  • 添加清晰注释:标注脚本的用途、操作对象、执行条件,方便后续维护人员理解。

优化后的生产就绪插入脚本

-- 用途:向AppVersion表插入Android和iOS版本记录(仅当记录不存在时)
-- 操作表:tpaApp.dbo.AppVersion
BEGIN TRANSACTION;
BEGIN TRY
    -- 插入Android版本记录
    IF NOT EXISTS(SELECT 1 FROM AppVersion WHERE key1 = 401 AND key2 = 800)
    BEGIN
        INSERT INTO AppVersion (key1, key2, name, value, timestamp, changed, disabled, [delete])
        VALUES (401, 800, 'AndroidVersion', '1.0.1', GETDATE(), 0, 0, 0);
        PRINT '成功插入AndroidVersion记录';
    END
    ELSE
    BEGIN
        PRINT 'AndroidVersion记录已存在,无需插入';
    END

    -- 插入iOS版本记录
    IF NOT EXISTS(SELECT 1 FROM AppVersion WHERE key1 = 401 AND key2 = 900)
    BEGIN
        INSERT INTO AppVersion (key1, key2, name, value, timestamp, changed, disabled, [delete])
        VALUES (401, 900, 'IosVersion', '1.0.1', GETDATE(), 0, 0, 0);
        PRINT '成功插入IosVersion记录';
    END
    ELSE
    BEGIN
        PRINT 'IosVersion记录已存在,无需插入';
    END

    -- 无异常则提交事务
    COMMIT TRANSACTION;
    PRINT '所有操作执行完成,事务已提交';
END TRY
BEGIN CATCH
    -- 捕获异常,回滚事务并输出错误信息
    ROLLBACK TRANSACTION;
    PRINT '执行出错,事务已回滚';
    PRINT '错误信息:' + ERROR_MESSAGE();
    PRINT '错误编号:' + CAST(ERROR_NUMBER() AS VARCHAR);
END CATCH;
GO

优化后的生产就绪回滚脚本

-- 用途:回滚AppVersion表中Android和iOS版本的插入记录(仅当记录存在时)
-- 操作表:tpaApp.dbo.AppVersion
BEGIN TRANSACTION;
BEGIN TRY
    -- 删除Android版本记录
    IF EXISTS(SELECT 1 FROM AppVersion WHERE key1 = 401 AND key2 = 800)
    BEGIN
        DELETE FROM AppVersion WHERE key1 = 401 AND key2 = 800;
        PRINT '成功删除AndroidVersion记录';
    END
    ELSE
    BEGIN
        PRINT 'AndroidVersion记录不存在,无需删除';
    END

    -- 删除iOS版本记录
    IF EXISTS(SELECT 1 FROM AppVersion WHERE key1 = 401 AND key2 = 900)
    BEGIN
        DELETE FROM AppVersion WHERE key1 = 401 AND key2 = 900;
        PRINT '成功删除IosVersion记录';
    END
    ELSE
    BEGIN
        PRINT 'IosVersion记录不存在,无需删除';
    END

    -- 无异常则提交事务
    COMMIT TRANSACTION;
    PRINT '所有回滚操作执行完成,事务已提交';
END TRY
BEGIN CATCH
    -- 捕获异常,回滚事务并输出错误信息
    ROLLBACK TRANSACTION;
    PRINT '回滚出错,事务已回滚';
    PRINT '错误信息:' + ERROR_MESSAGE();
    PRINT '错误编号:' + CAST(ERROR_NUMBER() AS VARCHAR);
END CATCH;
GO

通用生产级SQL脚本模板(插入/更新/删除类)

-- 脚本用途:[这里写脚本的具体用途]
-- 操作对象:[数据库名].[架构名].[表名]
BEGIN TRANSACTION;
BEGIN TRY
    -- 执行具体操作(插入/更新/删除)
    -- 示例:
    -- IF NOT EXISTS(SELECT 1 FROM [表名] WHERE [条件列] = [条件值])
    -- BEGIN
    --     INSERT INTO [表名]([列1], [列2], ...) VALUES([值1], [值2], ...);
    --     PRINT '操作执行成功';
    -- END
    -- ELSE
    -- BEGIN
    --     PRINT '记录已存在,无需操作';
    -- END

    -- 无异常则提交事务
    COMMIT TRANSACTION;
    PRINT '所有操作执行完成,事务已提交';
END TRY
BEGIN CATCH
    -- 异常处理
    ROLLBACK TRANSACTION;
    PRINT '执行出错,事务已回滚';
    PRINT '错误信息:' + ERROR_MESSAGE();
    PRINT '错误编号:' + CAST(ERROR_NUMBER() AS VARCHAR);
    PRINT '错误行号:' + CAST(ERROR_LINE() AS VARCHAR);
END CATCH;
GO

内容的提问来源于stack exchange,提问作者Gautam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:18:40