Sql Server Case语句给出了用户定义函数的错误

时间:2008-11-19 18:12:17

标签: sql sql-server ssms

我想在用户定义的函数中使用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的原始样式......当然后我收到错误消息。

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 FUNCTION块以GO结尾,根据CASE的文档,我的语法正确。

我正在构建一个更大的标量函数,它将使用其他标量函数在我们的系统中生成与其他参数对应的生产编码。最好能够使用CASE,因为生产编码取决于产品和客户。

我的创建函数行的第二个例子中也出现了一个额外的错误:“不正确的语法:'创建函数'必须是批处理中唯一的语句”,但是其他一切都相同,我没有得到IF的错误。

我做错了什么,或者CASES只允许在SQL查询而不是标量函数中使用?错误消息来自SQL Server Management Studio的波形错误消息系统。

2 个答案:

答案 0 :(得分:4)

案例陈述应如下:

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

答案 1 :(得分: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是您变量的名称。我不确定为什么ms会被接受,除非有一个其他数据库对象的名称(一个表?) - 即使那样它也不会。 T-SQL中的所有变量和参数都以@为前缀。