在单个存储过程中返回多个Resultset是一种很好的做法

时间:2016-07-27 08:05:49

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

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

例如:

我有一个Person和一个Person_Address表。

创建表:

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个 {{ 1}} 声明。让我知道这是编程的好习惯吗?我无法在谷歌,雅虎和其他搜索引擎中得到关于此的具体解释。请帮助我。

1 个答案:

答案 0 :(得分:0)

我分成了不同的程序。

通常,应该有一种方法可以完成一件事。更易于开发,调试,部署和维护。

在客户端使用数据之前,SQL Server不会考虑完成任务(这会在ASYNC_NETWORK_IO等待时累积)。您可能会保留超过必要的资源。它也更有可能超时。

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

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