添加WTD计算列遇SQL错误:此上下文仅允许标量表达式,禁用子查询
解决计算列添加WTD时的报错问题
错误原因
你写的SQL里,计算列的定义包含了完整的SELECT查询语句,但SQL Server的计算列只允许标量表达式(即每行返回单个值的表达式),不允许嵌套子查询或完整的SELECT语句,这就是报错的根源。
修正后的SQL语句
直接将WTD的计算逻辑作为标量表达式写入计算列定义即可,不需要外层的SELECT:
ALTER TABLE dbo.factures_wtd ADD [WTD] AS ( SUM(prix) OVER ( PARTITION BY facture, YEAR(date_facture), MONTH(date_facture), DATEPART(WEEK, date_facture) ORDER BY date_facture ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) )
补充说明
- 计算列默认是非持久化的,每次查询时才会计算。如果需要将计算结果物理存储在表中(提升查询性能),可以在表达式后添加
PERSISTED关键字,但要确保分区和排序用到的列都是确定性的:ALTER TABLE dbo.factures_wtd ADD [WTD] AS ( SUM(prix) OVER ( PARTITION BY facture, YEAR(date_facture), MONTH(date_facture), DATEPART(WEEK, date_facture) ORDER BY date_facture ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) ) PERSISTED - 表达式中可以省略表名前缀
dbo.factures_wtd.,因为计算列是针对当前表的列进行计算。
内容的提问来源于stack exchange,提问作者Mahmoud Bouhorma
相关产品推荐
相关产品推荐

