使用SQL Server中的条件从存储过程中调用存储过程的正确语法是什么

使用SQL Server中的条件从存储过程中调用存储过程的正确语法是什么,sql,stored-procedures,conditional-statements,Sql,Stored Procedures,Conditional Statements,从存储过程中调用存储过程时,我把条件语句弄得一团糟。有人能帮我吗 CREATE PROCEDURE [dbo].[sp_Leaderboard] @CompetitionId INTEGER AS DECLARE @Competition TABLE (CompId INTEGER, CompFormat NVARCHAR(10) ) INSERT INTO @Competition SELECT Competiti

从存储过程中调用存储过程时,我把条件语句弄得一团糟。有人能帮我吗

    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带入我要进入的任何过程。

为什么不使用
IF
语句呢

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

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

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语句来决定要查询哪个表。

是的,理论上看起来不错,但我得到了一个错误:必须声明标量变量“@Competition”。我需要再次声明吗?@gallie:您需要为插入到
@Competition
表中的每一行执行该过程吗?@Cory:将只返回一行。@gallie:如果只有一行,请按照我上面编辑的答案尝试。谢谢,现在没有错误了,Brian,但目前还没有,因为两个存储过程sp_Strokes和sp_Stableford都在寻找要传入的CompetitionId参数。如何传入参数?有什么想法吗?我想你需要把双引号变成单引号。除此之外,这个看起来还不错。