代码之家  ›  专栏  ›  技术社区  ›  Paul Hadfield

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

  •  4
  • Paul Hadfield  · 技术社区  · 14 年前

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

    使用一个对另一个有什么实际好处吗?

    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 回复  |  直到 14 年前
        1
  •  3
  •   APC    14 年前

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

        2
  •  1
  •   codingbadger    14 年前

    我将返回单行并使用 SqlDataReader 获取信息。毕竟,单行可能会变成多行。

        3
  •  -2
  •   Denis Valeev    14 年前

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

    我只需要在您的实体和SQL表之间建立适当的映射,并获取所有必要的字段,而不是返回ID。

    但是假设我们有一个返回数百个ID的过程,如果您基于ID对数据进行一些复杂的过滤,那么您肯定不想返回它的全部记录。所以,YMMV。

    推荐文章