存储过程最佳实践?他们应该在插入之前检查外键是否存在?

Ste*_*tes 5 sql sql-server stored-procedures

在构建插入到简单链接表中的存储过程时,是否应检查FK是否存在并正常返回错误或只是让SQL抛出异常?

  • 什么是最佳做法?
  • 什么是最有效的?

以防万一有人不理解我的问题:

  • Table A
  • Table B
  • Table AB

我应该这样做:

IF EXISTS(SELECT 1 FROM A WHERE Id = @A) AND EXISTS(SELECT 1 FROM B WHERE Id = @B)
BEGIN
      INSERT AB (AId,BId) VALUES (@A,  @B)
END
ELSE
   --handle gracefully, return error code or something
Run Code Online (Sandbox Code Playgroud)

要么

INSERT AB (AId,BId) VALUES (@A, @B)
Run Code Online (Sandbox Code Playgroud)

并让SQL抛出异常

谢谢

小智 4

如果这些表在您的控制之下,则没有理由执行额外的检查。 假设它们设置正确,然后让 SQL 处理任何错误。不断地检查你是否确实做了你想做的事情是过度防御性的编程,会给你的代码增加不必要的复杂性。

例如,您不会编写如下代码:

i = 1;

if (i != 1) 
{
    print "Error: i is not 1!";
}
Run Code Online (Sandbox Code Playgroud)

我认为这种情况是相似的。

如果这些表不在您的控制之下,那么优雅地处理错误可能会很有用。例如,如果此过程可以在用户创建的任意一组表上运行,或者如果它将分发给需要在自己的数据库中设置表的外部用户,则您可能需要添加一些自定义错误处理。这样做的目的是让用户更清楚地描述出了什么问题。