ANSI_NULLS和QUOTED_IDENTIFIER行为

时间:2014-06-06 03:48:44

标签: sql sql-server tsql views sql-execution-plan

我有一个观点:

create view dbo.vMainTable
as
select MT.* from dbo.Table1 T1 with(index(dbo_Table1_UQ))
inner loop join dbo.MainTable MT with(index(dbo_MainTable_PK)) 
on T1.ID = MT.Table1_ID
go

在查询视图时,如果ANSI_NULLSQUOTED_IDENTIFIERS设置为OFF,则会收到以下错误。

Query processor could not produce a query plan because of the hints
defined in this query. Resubmit the query without specifying any hints and 
without using SET FORCEPLAN.

将它们切换为ON会使错误消失。在这个特定的观点中我有什么遗漏吗?

编辑:有很多地方我们的一些开发人员已经完成column_name = NULL而不是column_name IS NULL,如果我将这两者都切换到ON,这将会中断。我一直在寻找能够处理这种情况的解决方案。

2 个答案:

答案 0 :(得分:1)

with(index(dbo_Table1_UQ))with(index(dbo_MainTable_PK))结构是提示(就像您在WITH(...)中看到的任何内容一样)

SQL Server告诉您,如果ANSI_NULLS和/或QUOTED_IDENTIFIERS设置为OFF,则必须删除with(index(dbo_Table1_UQ))和{{1} }。

查询/视图通常不需要提示,并且会插入提示以优化查询的性能。您可以通过省略它们来找到改进的性能,但必须根据具体情况进行评估。如果您在SSMS中测试查询并显示执行计划和查询性能,则可以自行评估是否需要这些with(index(dbo_MainTable_PK))语句。

答案 1 :(得分:1)

正如@Damien_The_Unbeliever所建议的,我对所有脚本进行了ANSI_NULLQUOTED_IDENTIFIERS转换为ON的重大更改,并确保它们不会被转换{{ 1}}任何地方。谢谢。