存储过程返回一行,记录集或输出参数?

时间:2010-09-17 10:33:02

标签: sql-server stored-procedures

忽略ORM / NHibernate等。考虑传递唯一ID并从单行返回数据的常见要求(如果找到ID)。执行此操作的两种方法是返回记录集或使用输出参数。存储过程将从.NET C#代码调用 - 所以从这个角度来看,需要使用ExecuteNonQuery设置/读取其他参数,而另一个需要ExecuteScalar和访问/读取DataReader。

使用其中一种与另一种相比是否有任何实际好处?

CREATE PROC GetUserByRecordSet
  @UserID UniqueIdentifier
AS
BEGIN
   SELECT 
      ID,
      Name,
      EmailAddress
   FROM
      [User]
   WHERE
      id = @UserID
END
GO

CREATE PROC GetUserByOutputParams
  @UserID UniqueIdentifier,
  @Name NVARCHAR(255) OUTPUT,
  @EmailAddress NVARCHAR(500) OUTPUT
AS
BEGIN
   SELECT 
      @Name =Name,
      @EmailAddress = EmailAddress
   FROM
      [User]
   WHERE
      id = @UserID
END
GO

3 个答案:

答案 0 :(得分:3)

两种方法的主要区别在于灵活性。如果要更改返回的列,则更改返回记录集的过程的工作量会减少。

答案 1 :(得分:1)

我会返回单行并使用SqlDataReader来访问该信息。毕竟那一行可能会变成多行。

答案 2 :(得分:-2)

如果您只返回用户的ID,为了获取该用户信息,您的ORM需要再次往返数据库以获取有关该用户的其他信息。

我只是在您的实体和您的sql表之间设置正确的映射,并获取所有必需的字段,而不是返回ID。

但是假设我们有一个返回数百个ID的过程,如果你根据id对这些数据进行复杂的过滤,你肯定不想返回它的整个记录​​。所以,ymmv。