【问题标题】:Sql Server make stored proc show select and run other proc on select's resultsSql Server 使存储的过程显示选择并在选择的结果上运行其他过程
【发布时间】:2015-07-22 17:34:04
【问题描述】:

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

  1. 检查查询(IF EXISTS ...)是否会有结果
  2. 如果有结果,返回一行 ID 值为 webmethod 将使用
  3. 使用相同的 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


【解决方案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;

【讨论】:

  • 我最终得到了与此类似的东西,但有一个例外。我正在尝试对输出使用 return 语句而不是 OUTPUT 但即使 ADID 是 varchar 并且我在运行过程时在 proc 中将 @ADID 声明为 varchar 我得到 int 值 [而不是 '00005' 我得到'5'。这是因为我使用的是 return 而不是你的方式吗?
  • 将 return 与声明的输出参数一起使用应该可以一起使用(请参阅msdn.microsoft.com/en-us/library/…)。这听起来更像是 ADID 值在事件链中某处的数字和字符之间进行转换,并在此过程中丢失其前导零。但我不知道你的基础数据是什么样的,所以这只是一个猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多