2017-03-15 25 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

返回返回参数中的标量值与结果集之间的区别纯粹是语义上的。

指导使用哪种方法的设计决策应主要由上下文来驱动,但也应以风格和一致性为主。如果你的存储过程已经产生了一个结果集,那么返回参数可以是一种方便的方法,也可以将一个标量值传回给你的应用程序。某些客户端应用程序或数据访问层可能不太适合处理返回参数。了解客户端应用程序可能有助于整体设计。一致性也可能起作用。如果系统中的存储过程通常返回标量值的结果集,并且您的代码已经过优化,那么添加一个以不同方式返回数据的新存储过程可能不是一个优雅的解决方案,并且可能会增加复杂性。总体而言,理解系统中的所有部分以及它们如何与存储过程进行交互将导致最优设计方法。