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 的原始样式...WHEN THEN BLOCK 我收到一条错误消息。

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 

对于我的 when 部分,我收到 Incorrect Syntax near case 和不正确的语法错误。

我已经正确地对所有内容进行了批处理,因为我的最后一个 CREATE FUNCTION 块以 GO 结尾,并且根据 CASE 上的文档,我有正确的语法。

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

在我的 Create Function 行的第二个示例中,我还收到一个额外的错误,上面写着“不正确的语法:'Create Function' 必须是批处理中的唯一语句”,但是其他所有内容都相同,我没有得到那个错误IF。

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

4

2 回答 2

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
于 2008-11-19T18:15:08.940 回答
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从它里面 - 它有点像IIF()在 VB 或IF()Excel 中。较早的答案基本上解释了这一点。

  2. VARCHAR意味着VARCHAR(1),所以你会被截断 - 即你永远不会看到'BAD'出来,只有'B'. 我不知道为什么当它发生时你没有收到截断警告,就像你在 some 上一样SQL INSERT,但是你去了。

  3. @ms是你的变量名。我不确定为什么 ms 会被接受,除非有其他一些具有该名称的数据库对象(表?)——即使那样也不会。中的所有变量和参数T-SQL都带有@这样的前缀。

于 2008-11-19T18:41:17.717 回答