【问题标题】:Returning Multiple Resultset in a single Stored Procedure is a good practice在单个存储过程中返回多个结果集是一个好习惯
【发布时间】:2016-12-01 03:02:58
【问题描述】:

我在 SQL Server 中有一个存储过程,它包含多个结果集(即,它包含多个 SELECT 语句)。这是一种编程的好习惯?

例如:

我有一个Person 和一个Person_Address 表。

创建表:Person

CREATE TABLE [dbo].[Person]
(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [firstName] [varchar](50) NOT NULL,
    [lastName] [varchar](50) NOT NULL,
)

插入数据:

INSERT INTO dbo.Person([firstName], [lastName)
VALUES ('John', 'Michle')

INSERT INTO dbo.Person([firstName], [lastName])
VALUES ('Emma', 'Watson')
GO

创建表Person_Address

CREATE TABLE [dbo].[Person_Address]
(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [pid] [int] NOT NULL,   
    [address] [varchar](50) NOT NULL,
    [city] [varchar](50) NOT NULL,
)

插入数据:

INSERT INTO dbo.Person_Address([pid], [address], [city], [ispreferred])
VALUES ('1', 'Eiffel Tower', 'Paris'])

INSERT INTO dbo.Person_Address([pid], [address], [city], [ispreferred])
VALUES ('1', 'Donghai Bridge', 'China')

INSERT INTO dbo.Person_Address([pid], [address], [city], [ispreferred])
VALUES ('2', 'Nile River', 'Egypt')
GO

存储过程返回多个结果集

CREATE PROCEDURE GetPersonInfoMultiRS 
    @PersonID int
AS
BEGIN
    SET NOCOUNT ON;
    SELECT p.* FROM Person p WHERE p.id = @PersonID;
    SELECT pa.* FROM Person_Address pa WHERE pa.pid = @PersonID;
END
GO

在上面的存储过程中 GetPersonInfoMultiRS 包含两个 SELECT 语句,在我的实际项目中我有 18 个 SELECT 声明。让我知道这是不是编程的好习惯?我无法在谷歌、雅虎和其他搜索引擎中得到具体的解释。请帮助我。

【问题讨论】:

    标签: sql sql-server stored-procedures multiple-resultsets


    【解决方案1】:

    我会分成不同的程序。

    一般来说,应该有一个方法做一件事。更易于开发、调试、部署和维护。

    在客户端消费数据之前,SQL Server 不会认为任务已完成(这将累积为 ASYNC_NETWORK_IO 等待)。您可能会将资源保留超过必要的时间。它也更有可能超时。

    此外,它不仅仅是 18 个结果集,还包含大量生成它们的过程中的代码。这意味着如果/当重新编译过程时,优化器需要做更多的工作,并且可能需要相当长的时间。

    我可能忘记了其他一些事情..

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 2013-10-06
      • 2012-07-19
      相关资源
      最近更新 更多