如何用SQL将HSL颜色转换为SSRS可用的RGB和HEX格式?
在SQL中实现HSL到RGB/HEX的转换以支持SSRS平滑色彩过渡条件格式
要实现SSRS表格的平滑色彩过渡条件格式,核心是通过HSL色彩模型的亮度分量随数据动态调整,再将HSL转换为SSRS支持的RGB或HEX颜色代码。以下是T-SQL实现方案:
1. HSL转RGB的T-SQL函数
先创建一个标量函数,将HSL(色相H:0-360,饱和度S:0-1,亮度L:0-1)转换为RGB(红、绿、蓝各0-255):
CREATE FUNCTION dbo.HSLToRGB ( @H FLOAT, @S FLOAT, @L FLOAT ) RETURNS VARCHAR(20) -- 返回格式:'R,G,B' AS BEGIN DECLARE @C FLOAT = @S * (1 - ABS(2*@L - 1)) DECLARE @X FLOAT = @C * (1 - ABS((@H / 60) % 2 - 1)) DECLARE @M FLOAT = @L - @C/2 DECLARE @R FLOAT, @G FLOAT, @B FLOAT IF @H >= 0 AND @H < 60 SELECT @R = @C, @G = @X, @B = 0 ELSE IF @H >= 60 AND @H < 120 SELECT @R = @X, @G = @C, @B = 0 ELSE IF @H >= 120 AND @H < 180 SELECT @R = 0, @G = @C, @B = @X ELSE IF @H >= 180 AND @H < 240 SELECT @R = 0, @G = @X, @B = @C ELSE IF @H >= 240 AND @H < 300 SELECT @R = @X, @G = 0, @B = @C ELSE IF @H >= 300 AND @H <= 360 SELECT @R = @C, @G = 0, @B = @X -- 转换为0-255的整数并拼接 RETURN CONVERT(VARCHAR(3), ROUND((@R + @M)*255, 0)) + ',' + CONVERT(VARCHAR(3), ROUND((@G + @M)*255, 0)) + ',' + CONVERT(VARCHAR(3), ROUND((@B + @M)*255, 0)) END
2. HSL转HEX的T-SQL函数
如果需要直接输出SSRS支持的HEX格式,可以基于上面的RGB结果再转换:
CREATE FUNCTION dbo.HSLToHEX ( @H FLOAT, @S FLOAT, @L FLOAT ) RETURNS CHAR(7) -- 返回格式:'#RRGGBB' AS BEGIN DECLARE @RGB VARCHAR(20) = dbo.HSLToRGB(@H, @S, @L) DECLARE @R INT = CONVERT(INT, LEFT(@RGB, CHARINDEX(',', @RGB)-1)) DECLARE @G INT = CONVERT(INT, SUBSTRING(@RGB, CHARINDEX(',', @RGB)+1, CHARINDEX(',', @RGB, CHARINDEX(',', @RGB)+1)-CHARINDEX(',', @RGB)-1)) DECLARE @B INT = CONVERT(INT, RIGHT(@RGB, LEN(@RGB)-CHARINDEX(',', @RGB, CHARINDEX(',', @RGB)+1))) RETURN '#' + RIGHT('0' + CONVERT(VARCHAR(2), @R, 2), 2) + RIGHT('0' + CONVERT(VARCHAR(2), @G, 2), 2) + RIGHT('0' + CONVERT(VARCHAR(2), @B, 2), 2) END
3. 在SSRS中的使用方法
假设你的表格数据有一个数值字段(比如SalesAmount),需要基于该字段的相对值调整亮度:
- 先在数据集查询中计算该字段的最小值、最大值,再计算当前行的亮度比例(确保值在0-1区间内)
- 调用上述SQL函数生成对应颜色,最后在SSRS单元格的填充颜色表达式中引用该颜色字段
示例数据集查询:
SELECT SalesAmount, -- 固定色相为120(绿色)、饱和度0.7,亮度随销售额动态变化 dbo.HSLToHEX(120, 0.7, CASE WHEN (SELECT MAX(SalesAmount)-MIN(SalesAmount) FROM Sales) = 0 THEN 0.5 ELSE (SalesAmount - (SELECT MIN(SalesAmount) FROM Sales)) / (SELECT MAX(SalesAmount)-MIN(SalesAmount) FROM Sales) END) AS HEXColor FROM Sales
在SSRS中,直接将单元格的填充颜色表达式设置为=Fields!HEXColor.Value即可实现平滑色彩过渡效果。
内容的提问来源于stack exchange,提问作者Roman Udaltsov
相关产品推荐
相关产品推荐

