我想知道是否有人可以帮助我将这两个存储过程合并为一个。
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来检查结果集,返回两列并更新。
提前致谢
答案 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
;
以上内容会将匹配的行和更新为Prefix
和Counter
作为行集Counter
,其中包含之前的值 >更新。当然,如果找不到匹配的行,则不会更新任何内容并返回空行集,与您当前的功能大致相同。