如何解决MS SQL Server 2008-R2兼容级别80下存储过程的UNPIVOT语法错误?
解决SQL Server兼容级别80下UNPIVOT语法报错的问题
嘿,这个问题的根源我门儿清!你的数据库兼容级别设置为80(对应SQL Server 2000版本),而UNPIVOT是SQL Server 2005及更高版本才引入的语法特性,所以在兼容级别80的环境下直接用UNPIVOT肯定会报语法错误。
下面给你两种实用解决方案,按需选择:
方案1:用UNION ALL模拟UNPIVOT的功能
这是兼容级别80下最稳妥的替代方法,通过UNION ALL把每个报废原因列拆成单独的行,完全模拟UNPIVOT的转置效果。针对你的表结构,示例存储过程代码如下:
CREATE PROCEDURE GetScrapDetails AS BEGIN SET NOCOUNT ON; SELECT Site, WorkCenter, CloseDate, 'Scratches' AS ScrapReason, Scratches AS ScrapCount FROM YourTableName UNION ALL SELECT Site, WorkCenter, CloseDate, 'Chips' AS ScrapReason, Chips AS ScrapCount FROM YourTableName UNION ALL SELECT Site, WorkCenter, CloseDate, 'Broken' AS ScrapReason, Broken AS ScrapCount FROM YourTableName UNION ALL SELECT Site, WorkCenter, CloseDate, 'Supplier' AS ScrapReason, Supplier AS ScrapCount FROM YourTableName -- 如果有更多报废原因列,继续添加UNION ALL分支即可 WHERE ScrapCount > 0; -- 可选:过滤掉无报废记录的行,减少结果集体积 END GO
方案2:提升数据库兼容级别(谨慎操作)
如果你的业务系统允许,且经过充分的兼容性测试,可以把数据库兼容级别提升到90(对应SQL Server 2005)或更高,这样就能直接使用UNPIVOT原生语法了。执行以下命令修改兼容级别:
ALTER DATABASE YourDatabaseName SET COMPATIBILITY_LEVEL = 90;
注意:提升兼容级别前一定要做好数据库备份,并且全面测试现有业务代码——比如一些SQL Server 2000特有的语法,在更高兼容级别下可能会出现兼容性问题。
内容的提问来源于stack exchange,提问作者bmiller762




