2016-04-28 42 views
1

鑑於類似以下,其中ID是主鍵,沒有行返回時SELECT INTO輸出參數?

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

會發生什麼,如果沒有行與指定的主鍵(ID)存在?我會失敗或將@RetVal留在未指定的狀態?

此外,程序的調用者如何知道這種情況?

回答

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?

+1

這個最近的答案,如果@Retval是未分配的,它會返回'NULL'。 –