将两个存储过程(选择和更新)组合成一个

时间:2013-10-30 10:13:25

标签: sql-server stored-procedures sql-update sql-insert

我想知道是否有人可以帮助我将这两个存储过程合并为一个。

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&计数器,而第二个增量计数器。我想要做的是检查第一个存储过程是否返回至少一个结果集,如果是,则返回前缀&反击并做第二次存储过程。

无论如何将这两者合二为一,可能比运行两个单独的存储过程更有效。我最初考虑使用IF ... ELSE来检查结果集,返回两列并更新。

提前致谢

2 个答案:

答案 0 :(得分: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作为​​结果的结果。在这种情况下,也将执行更新。否则,结果集将为空,不会执行更新。

答案 1 :(得分: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,其中包含之前的值 >更新。当然,如果找不到匹配的行,则不会更新任何内容并返回空行集,与您当前的功能大致相同。