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 来检查结果集,返回两列并更新。

提前致谢

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 回答
1

如果您使用的是 SQL Server 2005 或更高版本,则可以像这样使用OUTPUT 子句

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包含更新的值。自然,如果未找到匹配行,则不会更新任何内容并返回空行集,与您当前的功能或多或少相同。

于 2013-11-01T16:47:47.603 回答