请教一个函数中IF和CASE的正确写法

xiaoyehua 2014-04-15 01:52:24
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' 附近有语法错误。

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

谢谢大家啦。
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyehua 2014-04-15
  • 打赏
  • 举报
回复
感谢两位,我已经自己调试成功了。大概知道MSSQL函数的写法了。
xiaoyehua 2014-04-15
  • 打赏
  • 举报
回复
to #2 按照你的执行,提示错误:函数中最后一条语句必须是返回语句。
yoan2014 2014-04-15
  • 打赏
  • 举报
回复
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
            return case 
                when @type = 'B' or @type = 'b' THEN left(cast(@n as varchar(4)),1)
                when @type = 'S' or @type = 's' THEN substring(cast(@n as varchar(4)),2,1)
                when @type = 'G' or @type = 'g' THEN right(cast(@n as varchar(4)),1)
                else  0
            end 
        end
    else
        return 0
END
GO
Mr_Nice 2014-04-15
  • 打赏
  • 举报
回复
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)),
                                                           2, 1))
                               WHEN 'G'
                               THEN CONVERT(INT, RIGHT(CAST(@n AS VARCHAR(4)),
                                                       1))
                               ELSE 0
                             END 
            END
        RETURN @i
    END
GO

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧