2017-03-15 24 views
2

我使用OUT參數創建了一個過程,以便將主鍵插入表中。將OUT參數傳遞給程序不好嗎?

CREATE PROCEDURE spProcedureName (
    @Name VARCHAR(20) 
    ,@Place VARCHAR(20) 
    ,@InsertedId INT = 0 OUT 
    ) 
AS 
BEGIN 
    INSERT INTO TableName (
     NAME 
     ,Place 
     ) 
    VALUES (
     @Name 
     ,@Place 
     ); 

    SET @InsertedId = SCOPE_IDENTITY(); 
END; 

此過程用於我的C#代碼。我也從OUT參數中獲取值。

但是,這是同行審查,並要求不要使用OUT參數。他告訴改變程序如下。

CREATE PROCEDURE spProcedureName (
    @Name VARCHAR(20) 
    ,@Place VARCHAR(20) 
    ) 
AS 
BEGIN 

    DECLARE @InsertedId INT = 0; 
    INSERT INTO TableName (
     NAME 
     ,Place 
     ) 
    VALUES (
     @Name 
     ,@Place 
     ); 

    SET @InsertedId = SCOPE_IDENTITY(); 

    SELECT @InsertedId; 
END; 

我想知道爲什麼它不好使用OUT參數。請告訴我。我搜索,但沒有得到任何東西。

P.S:該文章中的程序只是一個示例。生成的ID在其他表中用作實際過程中的外鍵。

在此先感謝。

+1

我不認爲應該有區別。 –

+0

@ZoharPeled如果你處於這種狀況,你會選擇做什麼?我的意思是你認爲哪一個是正確的方式? –

+4

這是一個意見問題。就個人而言,我更喜歡將標量結果保存在輸出參數中,併爲真正的關係數據保留結果集。顯然,你的同行有相反的觀點。在這個例子中,程序不會產生其他的結果集,這不會有太大的區別。 –

回答

1

返回返回參數中的標量值與結果集之間的區別純粹是語義上的。

指導使用哪種方法的設計決策應主要由上下文來驅動,但也應以風格和一致性爲主。如果你的存儲過程已經產生了一個結果集,那麼返回參數可以是一種方便的方法,也可以將一個標量值傳回給你的應用程序。某些客戶端應用程序或數據訪問層可能不太適合處理返回參數。瞭解客戶端應用程序可能有助於整體設計。一致性也可能起作用。如果系統中的存儲過程通常返回標量值的結果集,並且您的代碼已經過優化,那麼添加一個以不同方式返回數據的新存儲過程可能不是一個優雅的解決方案,並且可能會增加複雜性。總體而言,理解系統中的所有部分以及它們如何與存儲過程進行交互將導致最優設計方法。