Хорошей практикой является возврат нескольких результатов в одной хранимой процедуре.

У меня есть хранимая процедура в SQL Server, он содержит несколько Resultset (т. Е. Он содержит несколько 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 SELECT Утверждение. Дайте мне знать, что это хорошая практика программирования или нет? Я не могу получить конкретное объяснение по этому поводу в Google, Yahoo и других поисковых системах. Пожалуйста, помогите мне.

1 ответ

Я бы разделил на отдельные процедуры.

Как правило, должен быть один метод, выполняющий одну вещь. Легче разрабатывать, отлаживать, развертывать и поддерживать.

SQL Server не будет считать задачу выполненной до тех пор, пока клиент не использует данные (это будет накапливаться как ожидание ASYNC_NETWORK_IO). Вы, вероятно, будете хранить ресурсы более, чем необходимо. Это также более вероятно для тайм-аута.

Кроме того, это не просто 18 наборов результатов, это также много кода внутри процедуры для их создания. Это означает, что оптимизатору потребуется гораздо больше работы, если / когда процедура будет перекомпилирована, и это может занять значительное время.

Есть, вероятно, некоторые другие вещи, которые я забыл..

Другие вопросы по тегам