鉴于以下内容,其中ID
是主键,
CREATE PROCEDURE Test
@ID INT,
@RetVal INT OUT
AS BEGIN
Select @RetVal = Column1 FROM Table1 WHERE ID = @ID;
END
如果指定的主键(ID
)没有行,会发生什么?我是否会失败或将@RetVal留在未指定的状态?
此外,程序的调用者怎么知道这种情况呢?
答案 0 :(得分:5)
变量(或本例中的参数)将具有之前的任何值,并且不进行任何分配。
如果程序的调用者没有明确地将其他任何内容作为值传递给参数,则在您的情况下这将是null
。
您可以在语句后立即检查@@rowcount
以查看涉及的行数。如果0没有进行任何分配,如果超过1则不确定实际分配了哪些可能的值。
如果匹配零行,您可以按如下方式重写以分配null(覆盖任何现有值),如果多行匹配则抛出错误。
Set @RetVal = (SELECT Column1 FROM Table1 WHERE ID = @ID);
另请参阅DBA网站Where do this Constant Scan and Left Outer Join come from in a trivial SELECT query plan?
上的最新答案