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