1

これらの 2 つのストアド プロシージャを 1 つに結合するのを手伝ってくれる人がいるかどうか疑問に思っています。

CREATE PROCEDURE [dbo].[spGetMsgID] 
    -- Add the parameters for the stored procedure here
    @SendingF      varchar(50),
    @SendingA      varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT Prefix, Counter
    FROM
        dbo.Part p
    JOIN
        dbo.MsgIDG g
    ON
        p.ID = g.PartID
    WHERE
        p.Facility = @SendingF 
    AND
        p.Application = @SendingA

END
GO

CREATE PROCEDURE [dbo].[spUpdateMsgID] 
    -- Add the parameters for the stored procedure here
    @SendingF      varchar(50),
    @SendingA      varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    UPDATE  dbo.MsgIDG
    SET Counter = Counter + 1
    FROM
        dbo.Part p
    JOIN
        dbo.MsgIDG g
    ON
        p.ID = g.PartID
    WHERE
        p.Facility = @SendingF 
    AND
        p.Application = @SendingA

END
GO

最初のストアド プロシージャは Prefix と Counter を返し、2 番目のストアド プロシージャは Counter をインクリメントします。私ができるようにしたいのは、最初のストアド プロシージャが少なくとも 1 つの結果セットを返すかどうかを確認し、そうであればプレフィックスとカウンターを返し、2 番目のストアド プロシージャを実行することです。

これら2つを1つに結合する方法はありますか?これは、2つの別々のストアド プロシージャを実行するよりも少し効率的です。最初は IF ... ELSE を使用して結果セットを確認し、2 つの列を返して更新することを考えていました。

前もって感謝します

4

2 に答える 2

1

SP のコードを次のように変更できます。

 SELECT Prefix, Counter
 FROM dbo.Part p
 JOIN dbo.MsgIDG g ON p.ID = g.PartID
 WHERE p.Facility = @SendingF AND p.Application = @SendingA;

 if @@rowcount > 0
    UPDATE  dbo.MsgIDG
    SET Counter = Counter + 1
    FROM dbo.Part p
    JOIN dbo.MsgIDG g ON p.ID = g.PartID
    WHERE p.Facility = @SendingF AND p.Application = @SendingA

説明: select ステートメントがデータを返す場合、SP の結果としてそれを受け取ります。この場合、更新も実行されます。それ以外の場合、結果セットは空になり、更新は実行されません。

于 2013-10-30T10:28:42.367 に答える