非常感谢您提供的任何帮助。我是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菜鸟。
答案 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)
CASE
是一个表达式(如a+b
) - NOT 一个语句 - 可以返回单个原子值(来自许多可能的值) - 它不能用于有选择地运行代码片段。
您需要将代码更改为
SELECT
@passed = CASE
WHEN @mId = 1 THEN 1
WHEN @mId = 2 THEN 1
......
等。 - 一项任务,而CASE
只提供各种可能的值