没有返回行时SELECT INTO输出参数?

时间:2016-04-28 15:25:45

标签: sql-server tsql stored-procedures

鉴于以下内容,其中ID是主键,

CREATE PROCEDURE Test
 @ID INT,
 @RetVal INT OUT
AS BEGIN
 Select @RetVal = Column1 FROM Table1 WHERE ID = @ID;
END

如果指定的主键(ID)没有行,会发生什么?我是否会失败或将@RetVal留在未指定的状态?

此外,程序的调用者怎么知道这种情况呢?

1 个答案:

答案 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?

上的最新答案