SQL Server动态透视查询中Prop01值错误,如何修正?
问题修复:动态Pivot中Prop01值错误的解决方法
错误原因分析
原代码通过三次UNION将每一行的IsEnabled、PropertyValueString、PropertyValueInt拆分为独立行,导致同一Name(如Prop01)对应多个ValueColumn值:'0'(来自IsEnabled)、'$'(来自PropertyValueString)、NULL(来自PropertyValueInt)。
Pivot阶段使用max(ValueColumn)取字符串最大值时,由于ASCII码中'0'(48)大于'$'(36),最终取到了'0'而非预期的'$'。
修复后的代码
使用COALESCE函数按优先级合并三个列的值,确保每个行仅生成一条有效记录,避免同一Name下出现冲突值:
DECLARE @cols AS NVARCHAR(MAX)=''; DECLARE @query AS NVARCHAR(MAX)=''; SELECT @cols = @cols + QUOTENAME(Name) + ',' FROM (SELECT DISTINCT Name FROM ItemsTable WHERE LOWER(ObjectName) = LOWER(@objectName) GROUP BY Name) AS tmp SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols)) SET @query = 'SELECT * FROM ( SELECT [Name] ,COALESCE(PropertyValueString, CAST(PropertyValueInt AS VARCHAR(50)), CAST(IsEnabled AS VARCHAR(50))) as [ValueColumn] ,[ObjectName] FROM ItemsTable WHERE LOWER(ObjectName) = LOWER(@objectName) ) src pivot ( max(ValueColumn) for Name in (' + @cols + ') ) piv' EXEC sp_executesql @query, N'@objectName VARCHAR(100)', @objectName = @objectName;
修复说明
COALESCE按顺序返回第一个非空值:Prop01会优先取PropertyValueString的'$',Prop02取PropertyValueInt的'45',规则类行(如Rule01)则取IsEnabled的'1'。- 提前通过
WHERE条件过滤指定ObjectName的数据,减少后续处理的数据量,提升查询效率。
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

