SQL 功能:长CASE语句,到处都是错误

SQL Function: Long CASE Statement, Errors all over the place

如果您能提供任何帮助,我们将不胜感激。我是 SQL 编程的新手,可以整天用 C# 编写此代码,但在 SQL 中却很烂。所以无论如何。

我正在尝试发送两个用于确定对象是否具有 "passed" 测试的 int ID,然后 return 这样我就可以将其发送回我存储的程序。

每个语句的 then 之后有很多东西,但要点在那里。下面是简化的代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[getPPassed]
(
    @pId int,
    @mId int
)
RETURNS bit
AS
BEGIN

    -- Declare the return variable here
    DECLARE @passed int;

    SELECT CASE
    WHEN @mId = 1 THEN @passed = 1
    WHEN @mId = 2 THEN @passed = 1
    WHEN @mId = 3 THEN @passed = 1
    WHEN @mId = 4 THEN @passed = 1
    WHEN @mId = 5 THEN @passed = 1
    WHEN @mId = 17 THEN @passed = 1
    WHEN @mId = 7 THEN @passed = 1
    WHEN @mId = 16 THEN @passed = 1
    WHEN @mId = 8 THEN @passed = 1
    WHEN @mId = 9 THEN @passed = 1
    WHEN @mId = 10 THEN @passed = 1
    WHEN @mId = 11 THEN @passed = 1
    WHEN @mId = 12 THEN @passed = 1
    WHEN @mId = 13 THEN @passed = 1
    WHEN @mId = 14 THEN @passed = 1
    WHEN @mId = 15 THEN @passed = 1
    ELSE @passed = 0
    END

    IF @passed = 1 RETURN 1
    ELSE RETURN 0
END
GO

再次强调,如果您能提供任何帮助,我们将不胜感激。我有错误说 'ELSE' 和 'END' 附近有语法错误,还有函数本身的错误说 "ALTER FUNCTION must be the only statement in the batch."

抱歉我是个 SQL 菜鸟。

这可以更简单地表述为:

SELECT @passed = (CASE WHEN @mId IN (1, 2, 3, 4, 5, 17, 7, 16, 8, 9, 10, 11, 12, 13, 14, 15)
                       THEN 1 ELSE 0
                  END);

如果你想要一个范围,那就更简单了:

SELECT @passed = (CASE WHEN @mId BETWEEN 1 AND 17
                       THEN 1 ELSE 0
                  END);
T-SQL 中的

CASE 是一个 表达式 (如 a+b)- NOT语句 - 可以 return 单个原子值(来自许多可能的值) - 它不能用于选择性地 运行 代码片段。

您需要将代码更改为

SELECT 
    @passed = CASE
                 WHEN @mId = 1 THEN 1
                 WHEN @mId = 2 THEN 1
               ......

等- 一个赋值,而CASE只是提供各种可能的值