我发现SQL存储过程非常有趣和有用。我已经编写了存储过程,但我希望为任何类型的需求编写精心设计、性能调优和简洁的SPs,并且希望了解存储过程的任何技巧或良好实践。如何从初学者到高级阶段编写存储过程?
更新:从评论中发现,我的问题应该更加具体。每个人的袖子上都有一些技巧,我期待着他们在代码中使用的SPs这样的技巧和实践,这使他们与其他人区别开来,更重要的是,提高了编写和使用存储过程的效率。
发布于 2008-11-19 23:39:17
以下是我的存储过程错误处理指南。
发布于 2008-11-19 21:39:21
我一直试图使用的唯一技巧是:始终在顶部的注释中包含一个示例用法。这对于测试你的SP也很有用。我喜欢包含最常见的例子--那么您甚至不需要使用SQL提示符或带有您最喜欢的调用的单独.sql文件,因为它就存储在服务器中(如果您存储了查看块或其他方面的sp_who输出并接受一堆参数的procs ),这将特别有用。
类似于:
/*
Usage:
EXEC usp_ThisProc @Param1 = 1, @Param2 = 2
*/然后,要测试或运行SP,只需在脚本中突出显示该部分并执行。
发布于 2009-10-07 09:17:44
坏:
SET NOCOUNT ON
BEGIN TRAN
INSERT...
UPDATE...
COMMIT更好,但看上去很混乱,而且编码很痛苦:
SET NOCOUNT ON
BEGIN TRAN
INSERT...
IF @ErrorVar <> 0
BEGIN
RAISERROR(N'Message', 16, 1)
GOTO QuitWithRollback
END
UPDATE...
IF @ErrorVar <> 0
BEGIN
RAISERROR(N'Message', 16, 1)
GOTO QuitWithRollback
END
EXECUTE @ReturnCode = some_proc @some_param = 123
IF (@@ERROR <> 0 OR @ReturnCode <> 0)
GOTO QuitWithRollback
COMMIT
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0)
ROLLBACK TRANSACTION
EndSave:好:
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRY
BEGIN TRAN
INSERT...
UPDATE...
COMMIT
END TRY
BEGIN CATCH
IF (XACT_STATE()) <> 0
ROLLBACK
END CATCH最佳:
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
INSERT...
UPDATE...
COMMIT那么,“最佳”解决方案的错误处理在哪里呢?你不需要任何东西。请参阅SET XACT_ABORT ON,这意味着如果有任何错误,则执行自动回滚。代码更干净、更容易阅读、更易于编写、更少的buggy。错误少了,因为没有机会错过错误条件,因为Server现在为您做了这件事。
https://stackoverflow.com/questions/303417
复制相似问题