“内部错误:已达到表达式服务限制。请在查询中查找可能复杂的表达式,并尝试简化它们。”
之前有没有人见过这个并找到了一个好的解决方法?
我设法解决了这个问题,主要是将我的SQL查询分成两部分,然后将第一个SQL select查询写入临时表,第二部分,新的SQL select语句从临时表中选择并使用了很多CROSS APPLY运算符用于计算级联计算列。
这是第二部分看起来如何但我正在使用更多Cross Applys来生成计算的新列的示例:
Select * from #tempTable
cross apply
(
select HmmLowestSalePrice =
round(((OurSellingPrice + 1.5) / 0.95) - (CompetitorsLowestSalePrice) + 0.08, 2)
) as HmmLowestSalePrice
cross apply
(
select checkLowestSP =
case
when adjust = 'No Room' then 'No Room'
when OrginalTestSalePrice >= CompetitorsLowestSalePrice then 'Minus'
when OrginalTeslSalePrice < CompetitorsLowestSalePrice then 'Ok'
end
) as checkLowestSP
cross apply
(
select AdjustFinalNewTestSP =
case
when FinalNewTestShipping < 0 Then NewTestSalePrice - (FinalNewTestShipping)
when FinalNewTestShipping >= 0 Then NewTestSalePrice
end
) as AdjustFinalNewTestSP
cross apply
(
select CheckFinalSalePriceWithWP =
case
when round(NewAdminSalePrice, 2) >= round(wholePrice, 2) then 'Ok'
when round(NewAdminSalePrice, 2) < round(wholePrice, 2) then 'Check'
end
) as CheckFinalPriceWithWP
DROP TABLE #tempTable
我的目标是将其放入sql报告中,如果只有1个用户,它将正常工作,因为#tempTable
将在同一执行中创建并删除,并且结果会正确显示在报告中。但是在将来如果有并发用户我会担心他们会写同一个#tempTable
会影响结果吗?
我已经考虑过把它放到存储过程中,但仍然会收到上面的错误信息。
答案 0 :(得分:6)
出现此问题是因为SQL Server限制了查询的单个表达式中可包含的标识符和常量的数量。限制是65,535。在SQL Server扩展所有引用的标识符和常量之后,将执行标识符和常量数量的测试。在SQL Server 2005及更高版本中,查询在内部进行了规范化和简化。这包括*(星号),计算列等。
要解决此问题,请重写您的查询。在查询中的最大表达式中引用较少的标识符和常量。您必须确保查询的每个表达式中的标识符和常量的数量不超过限制。为此,您可能必须将查询分解为多个单个查询。然后,创建一个临时的中间结果。
答案 1 :(得分:1)
我刚遇到这个问题并通过删除我桌子上的UNIQUE索引来修复它。出于某种原因,这似乎触发了这个错误,虽然它无法弄清楚原因。
顺便说一句,相同的查询可以与其他几个索引一起使用。
答案 2 :(得分:1)
对我来说有用的是尽可能用COALESCE
替换多个ISNULL
语句
答案 3 :(得分:0)
当我们尝试将数据库兼容级别更改为 150 时,我也遇到了同样的问题。当它是 140 或更低时,这不是问题。