4

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には 2 つのSELECTステートメントが含まれています。私の実際のプロジェクトでは、18個のSELECTステートメントがあります。これがプログラミングの良い習慣かどうか教えてください。これについては、グーグルやヤフーなどの検索エンジンで具体的な説明を得ることができません。親切に私を助けてください。

4

1 に答える 1

2

私は別々の手順に分割します。

一般に、1 つのことを行う単一のメソッドが存在する必要があります。開発、デバッグ、展開、および保守が容易になります。

SQL Server は、クライアントがデータを消費するまでタスクが完了したと見なしません (これは ASYNC_NETWORK_IO 待機として蓄積されます)。おそらく必要以上にリソースを保持するでしょう。タイムアウトする可能性も高くなります。

さらに、18 個の結果セットだけでなく、それらを生成するためのプロシージャ内のコードも大量です。これは、プロシージャが再コンパイルされた場合、オプティマイザの作業が大幅に増えることを意味し、かなりの時間がかかる可能性があります。

他にも忘れ物がありそうです..

于 2016-07-27T08:19:43.783 に答える