Sql server 返回一行、记录集或输出参数的存储过程? 忽略ORM/NHiBiNess等。考虑通过一个唯一ID并从单个行返回数据(如果找到ID)的共同要求。实现这一点的两种方法是返回记录集或使用输出参数。存储的proc将从.NET C#代码调用-因此从这个角度来看,一个需要使用ExecuteOnQuery设置/读取其他参数,而另一个需要ExecuteCalar和访问/读取DataReader

Sql server 返回一行、记录集或输出参数的存储过程? 忽略ORM/NHiBiNess等。考虑通过一个唯一ID并从单个行返回数据(如果找到ID)的共同要求。实现这一点的两种方法是返回记录集或使用输出参数。存储的proc将从.NET C#代码调用-因此从这个角度来看,一个需要使用ExecuteOnQuery设置/读取其他参数,而另一个需要ExecuteCalar和访问/读取DataReader,sql-server,stored-procedures,Sql Server,Stored Procedures,使用其中一个与使用另一个相比,有什么真正的好处吗 CREATE PROC GetUserByRecordSet @UserID UniqueIdentifier AS BEGIN SELECT ID, Name, EmailAddress FROM [User] WHERE id = @UserID END GO CREATE PROC GetUserByOutputParams @UserID Uniqu

使用其中一个与使用另一个相比,有什么真正的好处吗

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

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

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


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

我将返回单个行,并使用a访问信息。毕竟,一行可能变成多行。

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

我想我应该补充一句,我一直更喜欢记录集方法,但那只是因为这是我最初学习的方式。我可以看到,这种方法的一个好处是它抽象了底层的数据类型/大小。如果名称在表中的大小增加,则需要在引用的所有位置修改输出参数。我不确定这是否回答了提出的问题和给出的示例。它正在传递唯一ID并返回与该记录关联的(有限的)数据。我问的是,纯粹就给出的例子而言,什么是更好的方法,记录集或输出参数。@Paul Hadfield,前两句话解决了你的问题。第三个是关于在其他情况下要记住什么。同样,如果您有一个与数据库同步的ORM,并且缓存了流行实体的数据,那么您可以返回ID,否则最好返回所有必需的字段。