【发布时间】:2015-07-22 17:34:04
【问题描述】:
我需要创建一个存储过程,该过程将从 Web 方法中调用。基本思想是proc需要
- 检查查询
(IF EXISTS ...)是否会有结果 - 如果有结果,返回一行 ID 值为 webmethod 将使用
- 使用相同的 ID 调用另一个存储过程作为 参数(然后此 proc 将更新第一个 proc 采用的记录 ID 来自并增加其中一个列的值)。
到目前为止我有
CREATE PROC Sponsors.GetLightBoxAds (@SponsorID varchar(30))
AS
BEGIN
IF EXISTS (SELECT TOP 1
AD.ADID
FROM Sponsors.AD
WHERE AD.Active = 1 and AD.Sponsor = @SponsorID)
--takes the ID value of first active AD record it finds, at random, for that sponsor
BEGIN
SELECT TOP 1
AD.ADID --I want to use this value as my parameter for the second proc.
FROM Sponsors.AD
WHERE AD.Active = 1
ORDER BY newid()
--Ideally I'd like to call a separate proc here because there's more to be done
--but for testing I'm trying to run the update here
UPDATE Sponsor.AD
SET AD.CurrentClickCount = AD.CurrentClickCount + 1
WHERE ADID = @ADID -- use the result of the first select here.
END
END
GO
有没有办法让 proc 既返回我想要的 ID,又使用该 ID 作为调用的参数调用另一个 proc?
我可以将其拆分为单独的调用,并让 Web 后端处理参数调用,但这会增加延迟,并且如果延迟变大可能会出现并发问题,因此我希望服务器尽快运行这两个调用。
【问题讨论】:
-
我没有看到您使用 @SponsorID 参数。你会在哪里使用它?
-
OUTPUT参数。但是为了获取AD.ADID,你真的需要一个过程 -
您的更新声明中有
ORDER BY?? -
order by 应该在选择中,但我忘记包含 @sponsorID 参数。感谢您的建议。 Fireblade,你能解释一下你的输出参数是什么意思吗?数据库将通过 Web 方法和最终的 API 访问,因此我更喜欢使用存储过程。
-
你需要先声明
@ADID参数,然后在做top 1的时候,设置@ADID参数即可。所以选择应该看起来像SELECT TOP 1 @ADID = AD.ADID FROM Sponsors.AD WHERE AD.Active = 1 ORDER BY NEWID(),然后用它来更新记录。我认为不需要为更新语句调用另一个存储过程,除非它做一些额外的事情。
标签: sql sql-server stored-procedures