2016-07-27 14 views
3

Ich habe eine gespeicherte Prozedur in SQL Server enthält mehrere Resultset (d. H. Es enthält mehrere SELECT Statement). Es ist eine gute Praxis der Programmierung?Mehrere Resultsets in einer einzigen gespeicherten Prozedur zurückgeben ist eine gute Praxis

Beispiel:

Ich habe ein Person und ein Person_Address Tisch.

Tabelle erstellen: Person

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

Insert Daten:

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

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

Tabelle erstellen 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 Daten:

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 

gespeicherte Prozedur setzt mehrere Ergebnis Rückkehr

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 

In der oben Stored Procedure GetPersonInfoMultiRS enthält zwei SELECT Statement, ich bin 18 In meinem realen Projekt SELECT Statement mit. Lassen Sie mich wissen, dass dies eine gute Programmierung ist oder nicht? Eine konkrete Erklärung dazu kann ich bei Google, Yahoo und anderen Suchmaschinen nicht finden. Bitte hilf mir.

Antwort

0

Ich würde in separate Verfahren aufgeteilt werden.

Im Allgemeinen sollte es eine einzige Methode geben, die eine einzige Sache macht. Leichter zu entwickeln, zu debuggen, bereitzustellen und zu warten.

Der SQL Server berücksichtigt die Aufgabe erst dann, wenn der Client die Daten verbraucht hat (dies wird als ASYNC_NETWORK_IO akkumuliert). Sie werden wahrscheinlich die Ressourcen für mehr als nötig behalten. Es ist auch wahrscheinlicher, dass die Zeit abläuft.

Weiter sind es nicht nur 18 Resultsets, es ist auch eine Menge Code innerhalb des Verfahrens, um sie zu produzieren. Dies bedeutet viel mehr Arbeit für den Optimierer, wenn/wenn die Prozedur neu kompiliert wird, und könnte eine beträchtliche Menge an Zeit benötigen.

Es gibt wahrscheinlich einige andere Dinge, die ich vergessen habe ..