【问题标题】:Sql Server Case Statement gives me errors in user-defined functionSql Server Case Statement 在用户定义的函数中给了我错误
【发布时间】:2010-09-23 02:27:36
【问题描述】:

我想在我的用户定义函数中使用 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 错误消息系统。

【问题讨论】:

    标签: sql sql-server ssms


    【解决方案1】:

    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
    

    【讨论】:

    • ms 必须是 @ms 并且代码无论如何都不会工作,因为所有 varchar 变量都默认为 varchar(1)
    【解决方案2】:

    我认为您的问题是因为您没有在 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() 或 Excel 中的 IF()。较早的答案基本上解释了这一点。

    2. VARCHAR 表示 VARCHAR(1),所以你会被截断 - 即你永远不会看到 'BAD' 出来,只有 'B'。我不知道为什么当你遇到一些SQL INSERT 时你没有收到截断警告,但是你去吧。

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

    【讨论】:

    • 所以我不能仅通过变量名来引用我的变量?我必须在任何地方都使用@ms?
    • 托尼,我想他想说的是,如果你没有指定它返回的 VARCHAR 的大小,如果你传入一个无效的输入(这将导致输出为'BAD'),你'会回来只是'B'。因此,您应该将 VARCHAR 的长度设置为您期望的任何最大大小。
    • 我认为我做错了三件事。我是 SQL Server 1 中存储过程和标量函数的新手。不应该在 CASE 的 then 子句中包含返回值。 2.设置varchar的大小 3.@var引用变量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2010-12-01
    • 2016-11-25
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多