2013-02-24 68 views
3

从存储过程中调用存储过程时,混淆了条件语句。谁能帮我吗?什么是使用SQL Server中的条件从存储过程调用存储过程的正确语法

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我去入过过程。

回答

4

为什么不只是使用IF声明?

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

是的,理论上看起来不错,但我得到的错误:必须声明标量变量“@Competition”。我需要再次申报吗? – gallie 2013-02-24 00:14:06

+0

@gallie:您是否需要为插入到“@竞争”表中的每一行执行过程? – 2013-02-24 00:17:10

+0

@Cory:只会有一行返回。 – gallie 2013-02-24 00:18:29

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语句从查询的表来决定。

+0

我认为你需要将双引号加入单引号。除此之外,这看起来不错。 – 2013-02-24 00:32:41

+0

@BrianRogers:很好。谢谢(和更新)! – 2013-02-24 00:54:22

+0

+1用于修复:-) – 2013-02-24 01:07:46