日期:2014-05-16  浏览次数:20698 次

请教一个函数中IF和CASE的正确写法
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
创建一函数,用来判断一个数字@n是否为3位数,并且根据@type来返回这个3位数的百位数或十位数或个位数
B:百位数
S:十位数
G:个位数
其他情况则返回0
比如uf1(234,'b')返回2
*/
CREATE FUNCTION uf1(@n int,@type varchar(2))
RETURNS int
AS
BEGIN
if @n >0 and @n <1000
begin
case 
when @type = 'B' or @type = 'b' THEN return left(cast(@n as varchar(4)),1)
when @type = 'S' or @type = 's' THEN return substring(cast(@n as varchar(4)),2,1)
when @type = 'G' or @type = 'g' THEN return right(cast(@n as varchar(4)),1)
else return 0
end 
end
else
return 0
END
GO


结果错误如下:消息 156,级别 15,状态 1,过程 uf1,第 15 行
关键字 'case' 附近有语法错误。
消息 156,级别 15,状态 1,过程 uf1,第 17 行
关键字 'when' 附近有语法错误。
消息 156,级别 15,状态 1,过程 uf1,第 18 行
关键字 'when' 附近有语法错误。
消息 156,级别 15,状态 1,过程 uf1,第 19 行
关键字 'else' 附近有语法错误。
消息 156,级别 15,状态 1,过程 uf1,第 21 行
关键字 'end' 附近有语法错误。
消息 102,级别 15,状态 1,过程 uf1,第 24 行
'END' 附近有语法错误。

麻烦各位帮看一下到底错在哪里,然后改成什么样才是对的?小弟已经查了帮助,自我感觉语法没错。

谢谢大家啦。

------解决方案--------------------
CREATE FUNCTION dbo.uf1 ( @n INT, @type VARCHAR(2) )
RETURNS INT
AS
    BEGIN
        DECLARE @i INT = 0
        IF @n > 0
            AND @n < 1000
            BEGIN
                SELECT  @i = CASE UPPER(@type)
                               WHEN 'B'
                               THEN CONVERT(INT, LEFT(CAST(@n AS VARCHAR(4)),
                                                      1))
                               WHEN 'S'
                               THEN CONVERT(INT, SUBSTRING(CAST(@n AS VARCHAR(4)),
                           &nb