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
相关产品推荐
相关产品推荐

