SQL函数:长CASE语句,错误到处都是

时间:2015-12-29 22:25:49

标签: sql sql-server user-defined-functions

非常感谢您提供的任何帮助。我是SQL编程的新手,可以整天用C#编写这段代码,但是在SQL中很糟糕。所以无论如何。

我正在尝试发送两个用于确定对象是否“通过”测试的int ID,然后返回,以便我可以将其发送回我的存储过程。

在每个陈述之后有很多事情,但要点就在那里。以下是简化代码:

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必须是批处理中唯一的语句。”

抱歉,我是一个SQL菜鸟。

2 个答案:

答案 0 :(得分:0)

这更简单地表达为:

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);

答案 1 :(得分:0)

T-SQL中的

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

您需要将代码更改为

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

等。 - 一项任务,而CASE只提供各种可能的值