SQL Server的Case语句让我在用户定义的函数错误

问题描述 投票:2回答:2

我想用一个case语句在我的用户定义的函数,因为我需要匹配的若干条款。我可以使用表格的比赛,但后来我就不能够把它计算列定义中。

这适用于IF语句:

CREATE FUNCTION MaraSizeNumber
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    IF ms = '16-18' RETURN '1'
    ELSE IF ms = '18-20' RETURN '2'
    ELSE IF ms = '20-22' RETURN '3'
    ELSE IF ms = '22+' RETURN '4'
    ELSE IF ms = '24+' RETURN '5'
    ELSE IF ms = '14-16' RETURN '7'
    ELSE RETURN 'BAD'
END

但随着使用CASE了原有的风格......然后当块I得到一个错误信息。

CREATE FUNCTION MaraSizeCaseExample
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    CASE ms
        WHEN '16-18' THEN RETURN '1'
        WHEN '18-20' THEN RETURN '2'
        WHEN '20-22' THEN RETURN '3'
        WHEN '22+' THEN RETURN '4'
        WHEN '24+' THEN RETURN '5'
        WHEN '14-16' THEN RETURN '7'
        ELSE RETURN 'BAD'
    END
END 

我得到附近有语法错误的情况下和不正确的语法附近时的错误我当零件。

我已经正确地分批的一切,因为我的最后CREATE功能块与GO结束,并根据对病例的文档,我有正确的语法。

我有一个较大的标量函数,我的建筑,将使用其他标量函数产生在我们的系统对应于其他参数编程。这将是最好的,能够因为生产编码取决于产品和客户使用CASE。

我也在我的创建函数线说,“不正确的语法:‘创建函数’必须在该批次中唯一的语句”获得第二个例子中的额外的错误,但一切同我没有得到与该错误国际单项体育联合会。

我在做什么错了,还是这样的情况只允许在SQL查询,而不是标量函数?该错误消息是从SQL Server Management Studio的抽搐错误信息系统的到来。

sql sql-server ssms
2个回答
4
投票

case语句应该是这样的:

RETURN CASE @ms
       WHEN '16-18' THEN '1'
       WHEN '18-20' THEN '2'
       WHEN '20-22' THEN '3'
       WHEN '22+' THEN '4'
       WHEN '24+' THEN '5'
       WHEN '14-16' THEN '7'
       ELSE 'BAD'
  END

3
投票

我觉得你的问题是,因为你没有指定你的VARCHAR大小(这是默认为1)。这导致输入和输出被截断为单个字符。 (你也缺少在函数内部变量的@。)

所以PRINT dbo.SizeExample('16-18')将打印'B'(这不仅是截断,它也没有你可能想要的答案,这是'1'

尝试改为:

CREATE FUNCTION MaraSizeExample
(
    @ms varchar(5)
)
RETURNS varchar(3)
AS
BEGIN
    RETURN CASE @ms
        WHEN '16-18' THEN '1'
        WHEN '18-20' THEN '2'
        WHEN '20-22' THEN '3'
        WHEN '22+' THEN '4'
        WHEN '24+' THEN '5'
        WHEN '14-16' THEN '7'
        ELSE 'BAD'
    END
END
  1. CASE仅仅是一个搜索(或查找)的表达 - 你不能从里面RETURN - 这有点像像VB IIF()IF()在Excel中。早期的答案基本解释说。
  2. VARCHAR意味着VARCHAR(1),所以你会得到截断 - 即你永远不会看到'BAD'出来,只有'B'。我不知道为什么你当它发生像你得到一些SQL INSERT没有得到截断警告,但你去那里。
  3. @ms是您的变量名。我不知道为什么,除非有该名称的其它数据库对象毫秒会被接受(表) - 即使如此,它不会是。在T-SQL所有变量和参数都带有前缀这样@
© www.soinside.com 2019 - 2024. All rights reserved.