Sql Server使存储过程显示选择并在select的结果上运行其他过程

时间:2015-07-22 17:34:04

标签: sql sql-server stored-procedures

我需要创建一个将通过Web方法调用的存储过程。基本思想是proc需要

  1. 检查查询(IF EXISTS ...)
  2. 是否有结果
  3. 如果有结果,请返回一行ID值为webmethod的行 将使用
  4. 使用与a相同的ID调用另一个存储过程 参数(此proc将更新第一个proc采取的记录 ID来自并增加其中一个列的值。)
  5. 到目前为止我已经

    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后端处理参数调用,但这会增加延迟,如果这个延迟变大,可能会出现并发问题,所以我更愿意让服务器同时运行两个调用。

1 个答案:

答案 0 :(得分:1)

如上所述,您首先需要声明@ADID - 类似于:

DECLARE @ADID INT;

完成后,选择您想要的ID:

SELECT TOP 1 @ADID = AD.ADID
FROM Sponsors.AD
WHERE AD.Active = 1 and AD.Sponsor = @SponsorID

然后你可以有条件地开始你的过程:

IF ISNULL(@ADID,-1) != -1
BEGIN 
 EXEC YourStoredProc @ADID
END

要在结尾处返回ID,请执行以下操作:

SELECT @ADID AS ADID;

您可以通过使用以下过程声明输出变量来使用输出参数方法:

CREATE PROC Sponsors.GetLightBoxAds (
@SponsorID varchar(30),
@ADIDOut INT OUTPUT
)
AS --...

然后做:

SELECT @ADIDOut = @ADID;