我遇到过一个客户遇到此错误的案例 - 偶尔:
消息 8624,级别 16,状态 21,第 1 行
内部查询处理器错误:查询处理器无法生成查询计划。如需更多信息,请联系客户支持服务。
他们正在使用我们的软件,并在 SQL Server 2008 R2 (RTM) 和兼容性级别 100 (SQL Server 2008) 上运行它。然而,该数据库最初是在 2000 或 2005 机器上创建的(无法再复制),然后最近移至 2008 R2。
有问题的存储过程有一个丑陋的INSERT
语句,它从给定表的十个(是的!)“副本”中获取数据,所有副本都RIGHT OUTER JOIN
相互连接(同一个表 - 十个 JOIN 反对它)。
我发现似乎最合适的一种解决方案与各种设置有关 - 建议使用:
set ANSI_NULLS ON
set ANSI_PADDING ON
set ANSI_WARNINGS ON
set CONCAT_NULL_YIELDS_NULL ON
set QUOTED_IDENTIFIER ON
set ARITHABORT ON
set NUMERIC_ROUNDABORT OFF
好的——当然——我可以在我创建(或更改)的每个存储过程之前设置这些。
我对数据库专家的问题是:当我将这些设置为我的数据库的默认设置时有什么风险吗?
例如
ALTER DATABASE MyDB SET ANSI_NULLS ON
并完成它?想法?洞察力?建议?
这根本不是风险。事实上,
ANSI_NULLS
关闭功能的寿命是有限的。很快,这甚至都不是一个选项,它永远是ON。我唯一一次看到设置ANSI_NULLS
OFF的任何形式的推理,是因为有些开发人员无法理解 的真正含义NULL
,因此想要使用典型的条件逻辑。再次,可怕的推理和不合理的。我期待. _ANSI_NULLS