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
相关产品推荐
相关产品推荐

