bln*_*hie 30 t-sql sql-server stored-procedures
我发现SQL存储过程非常有趣和有用.我已经编写了存储过程,但我想为任何类型的要求编写精心设计,性能良好的调优和简洁的SP,并且也希望了解存储过程的任何技巧或良好实践.如何在编写存储过程时从初学者升级到高级阶段?
更新:从评论中发现我的问题应该更加具体.每个人都有一些技巧,我期待他们在他们的代码中使用SP的技巧和做法,使他们与其他人区别开来,更重要的是提高写作和使用存储过程的工作效率.
Roa*_*ior 40
这是我的存储过程错误处理指南.
执行存储过程时,请始终检查@@ error和返回值.例如:
EXEC @err = AnyStoredProc @value
SET @save_error = @@error
-- NULLIF says that if @err is 0, this is the same as null
-- COALESCE returns the first non-null value in its arguments
SELECT @err = COALESCE( NULLIF(@err, 0), @save_error )
IF @err <> 0 BEGIN
-- Because stored proc may have started a tran it didn't commit
ROLLBACK TRANSACTION
RETURN @err
END
Run Code Online (Sandbox Code Playgroud)在以下声明后始终存储并检查@@ error:
INSERT, DELETE, UPDATE
SELECT INTO
Invocation of stored procedures
invocation of dynamic SQL
COMMIT TRANSACTION
DECLARE and OPEN CURSOR
FETCH from cursor
WRITETEXT and UPDATETEXT
Run Code Online (Sandbox Code Playgroud)Cad*_*oux 18
我总是尝试使用的唯一技巧是:始终在顶部附近的注释中包含示例用法.这对于测试SP也很有用.我喜欢包含最常见的示例 - 然后您甚至不需要SQL Prompt或单独的.sql文件与您最喜欢的调用,因为它存储在服务器中(如果您有存储的procs查看,这是特别有用的sp_who输出块或其他什么,并采取一堆参数).
就像是:
/*
Usage:
EXEC usp_ThisProc @Param1 = 1, @Param2 = 2
*/
Run Code Online (Sandbox Code Playgroud)
然后,要测试或运行SP,只需在脚本中突出显示该部分并执行即可.
AR.*_*AR. 11
这是一个非常普遍的问题,但这里有几条建议:
当然还有更多.以下是更多链接: SQL Server存储过程优化提示
Sim*_*hes 11
坏:
SET NOCOUNT ON
BEGIN TRAN
INSERT...
UPDATE...
COMMIT
Run Code Online (Sandbox Code Playgroud)
更好,但看起来凌乱,代码的主要痛苦:
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:
Run Code Online (Sandbox Code Playgroud)
好:
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
Run Code Online (Sandbox Code Playgroud)
最好:
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
INSERT...
UPDATE...
COMMIT
Run Code Online (Sandbox Code Playgroud)
那么"最佳"解决方案的错误处理在哪里?你不需要任何.请参阅SET XACT_ABORT ON,这意味着如果有任何错误,请执行自动回滚.代码更清晰,更易于阅读,更易于编写,并且减少了错误.由于SQL Server现在为您执行此操作,因此不会错过任何错误.
| 归档时间: |
|
| 查看次数: |
41499 次 |
| 最近记录: |