使用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参数。如何传入参数?有什么想法吗?我想你需要把双引号变成单引号。除此之外,这个看起来还不错。