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

Mr.*_*Boy 1 t-sql sql-server stored-procedures

鉴于以下内容,ID主键在哪里,

CREATE PROCEDURE Test
 @ID INT,
 @RetVal INT OUT
AS BEGIN
 Select @RetVal = Column1 FROM Table1 WHERE ID = @ID;
END
Run Code Online (Sandbox Code Playgroud)

如果指定的主键(ID)不存在行会发生什么?我会失败或将@RetVal留在未指定的状态吗?

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

Mar*_*ith 5

变量(或本例中的参数)将具有之前的任何值,并且不进行任何赋值.

如果过程的调用者没有明确地将任何其他内容作为参数传递给参数,那么这将是null您的情况.

您可以@@rowcount在语句后立即检查以查看涉及的行数.如果0没有进行任何分配,如果超过1则不确定实际分配了哪些可能的值.

如果零行匹配,您可以按如下方式重写以分配null(覆盖任何现有值),如果多个行匹配则抛出错误.

 Set  @RetVal = (SELECT Column1 FROM Table1 WHERE ID = @ID);
Run Code Online (Sandbox Code Playgroud)

另请参阅DBA站点上的最新答案此常量扫描和左外部联接来自于一个简单的SELECT查询计划?