2013-10-30 41 views
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 

第一存儲過程返回前綴&計數器,而第二計數器的增量。我想要做的是檢查第一個存儲過程是否返回至少一個結果集,如果是這樣,返回前綴&計數器並執行第二個存儲過程。

有沒有辦法將這兩個組合成一個,比運行兩個單獨的存儲特效可能更有效。我最初想用IF ... ELSE來檢查結果集,返回兩列並更新。

在此先感謝

回答

1

如果您使用的是SQL Server 2005或更高版本,可以使用OUTPUT clause這樣的:

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

以上將更新匹配行返回PrefixCounter作爲一個行集,Counter包含之前的值的更新。當然,如果找不到匹配的行,則不會更新任何內容,並返回一個空行集,與您當前的功能差不多。

+0

謝謝。太精彩了。 – nixgadgets

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的結果。在這種情況下,更新也將被執行。否則,結果集將爲空並且不會執行更新。

相關問題