【问题标题】:What is the correct syntax to call a stored procedured from within a stored procedure using a condition in SQL Server使用 SQL Server 中的条件从存储过程中调用存储过程的正确语法是什么
【发布时间】:2013-02-09 10:17:26
【问题描述】:

我在从存储过程中调用存储过程时弄乱了条件语句。谁能帮帮我?

    CREATE PROCEDURE [dbo].[sp_Leaderboard] 

    @CompetitionId INTEGER

    AS

    DECLARE @Competition TABLE
    (CompId INTEGER,
    CompFormat NVARCHAR(10)
    )
    INSERT INTO @Competition
    SELECT CompetitionId, CompetitionFormatType
    FROM dbo.Competitions 
LEFT JOIN dbo.CompetitionFormat ON dbo.Competitions.CompetitionFormatId = dbo.CompetitionFormat.CompetitionFormatId
    WHERE CompetitionId = @CompetitionId


    CASE WHEN @Competition.CompFormat = "Strokes" THEN EXEC [dbo].[sp_Strokes] ELSE EXEC [dbo].[sp_Stableford]

此外,我知道我的代码中没有考虑到的一点是,我还需要将参数 @CompetitionId 带入我要去的任何程序中。

【问题讨论】:

    标签: sql stored-procedures conditional-statements


    【解决方案1】:

    为什么不直接使用IF 语句?

    IF (SELECT TOP 1 CompFormat FROM @Competition) = 'Strokes'
       BEGIN
           EXEC [dbo].[sp_Strokes] @CompetitionId 
       END
    ELSE
       BEGIN
           EXEC [dbo].[sp_Stableford] @CompetitionId 
       END
    

    【讨论】:

    • 是的,理论上看起来不错,但我得到错误:必须声明标量变量“@Competition”。我需要第二次申报吗?
    • @gallie:你需要为插入@Competition表的每一行执行这个过程吗?
    • @Cory:只会返回一行。
    • @gallie:如果只有一行,请按照我上面编辑的答案尝试
    • 谢谢你,Brian 现在没有错误,但还没有,因为 2 个存储过程 sp_Strokes 和 sp_Stableford 都在寻找要传入的 CompetitionId 参数。我如何传入参数?有什么想法吗?
    【解决方案2】:

    您可以随心所欲地同时消除表变量。试试这个:

    DECLARE @CompFormat varchar(50)
    
    SELECT @CompFormat = CompetitionFormatType
    FROM dbo.Competitions 
    LEFT JOIN dbo.CompetitionFormat 
        ON dbo.Competitions.CompetitionFormatId = dbo.CompetitionFormat.CompetitionFormatId
    WHERE CompetitionId = @CompetitionId
    
    IF @CompFormat = 'Strokes'
    BEGIN
        EXEC [dbo].[sp_Strokes] @CompetitionId
    END
    ELSE 
    BEGIN
        EXEC [dbo].[sp_Stableford] @CompetitionId
    END
    

    或者也许您应该创建一个以@Competition.CompFormat 作为参数的新存储过程,然后在其中使用 IF 语句来决定从哪个表中查询。

    【讨论】:

    • 我认为你需要把双引号变成单引号。除此之外,这看起来还不错。
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2011-12-03
    • 2012-08-17
    • 2013-08-06
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多