You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server自定义函数HotelLevel仅返回Silver,如何修复?

问题描述

我创建了一个名为HotelLevel的自定义函数,用于根据酒店的rating值返回对应的等级(Blue、Bronze、Silver、Gold、Platinum)。该函数在MySQL中运行正常,但迁移到SQL Server后,执行查询时所有结果的hotellevel仅为Silver。请帮忙检查代码并指导找出问题所在及修复方法。

原函数代码:

CREATE FUNCTION HotelLevel
(
    @rating DECIMAL(10,2)
)
RETURNS VARCHAR(20)
AS
BEGIN
    DECLARE @hotel_level VARCHAR(20);

    SELECT @rating = rating
    FROM Hotels;

    IF @rating < 4.10
        SET @hotel_level = 'Blue';    
    ELSE IF (@rating >= 4.10 AND @rating < 4.50)
        SET @hotel_level = 'Bronze'; 
    ELSE IF (@rating >= 4.50 AND @rating < 4.80)
        SET @hotel_level = 'Silver';
    ELSE IF (@rating >= 4.80 AND @rating < 4.90)
        SET @hotel_level = 'Gold';
    ELSE IF @rating >= 4.90
        SET @hotel_level = 'Platinum';

    RETURN @hotel_level;
END
问题原因

核心错误是函数中这行代码:

SELECT @rating = rating FROM Hotels;

在SQL Server中,当通过SELECT @变量 = 字段 FROM 表赋值时,如果表包含多条数据,变量会被赋值为表中最后一条数据的rating值,完全覆盖了你调用函数时传入的参数值。从结果来看,这个固定值刚好落在Silver的区间(4.50-4.80),所以所有查询结果都返回Silver。

修复方案

方案1:移除错误的赋值语句

直接删除那行覆盖参数的SELECT语句,让函数使用传入的@rating参数进行判断:

CREATE FUNCTION HotelLevel
(
    @rating DECIMAL(10,2)
)
RETURNS VARCHAR(20)
AS
BEGIN
    DECLARE @hotel_level VARCHAR(20);

    IF @rating < 4.10
        SET @hotel_level = 'Blue';    
    ELSE IF (@rating >= 4.10 AND @rating < 4.50)
        SET @hotel_level = 'Bronze'; 
    ELSE IF (@rating >= 4.50 AND @rating < 4.80)
        SET @hotel_level = 'Silver';
    ELSE IF (@rating >= 4.80 AND @rating < 4.90)
        SET @hotel_level = 'Gold';
    ELSE IF @rating >= 4.90
        SET @hotel_level = 'Platinum';

    RETURN @hotel_level;
END

方案2:用CASE语句简化逻辑

可以用CASE语句重构函数,让逻辑更简洁易懂:

CREATE FUNCTION HotelLevel
(
    @rating DECIMAL(10,2)
)
RETURNS VARCHAR(20)
AS
BEGIN
    RETURN CASE
        WHEN @rating < 4.10 THEN 'Blue'
        WHEN @rating < 4.50 THEN 'Bronze' -- 前面已过滤<4.10的情况,无需重复判断
        WHEN @rating < 4.80 THEN 'Silver'
        WHEN @rating < 4.90 THEN 'Gold'
        ELSE 'Platinum' -- 剩余均为>=4.90的情况
    END;
END

内容的提问来源于stack exchange,提问作者user22049687

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:38:18