创建一个将使用ANSI_NULLS OFF的筛选索引

时间:2013-10-03 20:50:25

标签: sql-server tsql sql-server-2012

我今天在使用10年前编写的旧Delphi应用程序。应用程序的某些部分包含将在应用程序中构造更新语句的组件,然后将它们发送到要运行的SQL Server。

我需要做的工作是尝试加快一些查询。为此,我添加了两个如下所示的索引:

CREATE NONCLUSTERED INDEX [ix_ClientFilerTo0]
ON [ClientTable] ([Client])
INCLUDE ([ClientCol1],[ClientCol2],[ClientCol3] ... Many more columns)
WHERE Client = 0


CREATE NONCLUSTERED INDEX [IX_Client_Status]
ON [OrderTable] ([Client],[Status])
INCLUDE ([OrderCol1],[OrderCol2],[OrderCol3],[OrderCol4])
WHERE [Status] <= 7
GO

当我这样做时,我收到以下错误:

  

UPDATE failed because the following SET options have incorrect settings: ANSI_NULL, QUOTED_IDENTIFIER, CONCAT_NULL_YIELDS_NUL

我尝试将这些设置添加到我的索引创建语句中,但它没有帮助。

我运行了一个SQL配置文件,我的应用程序连接列出了以下设置:

set quoted_identifier off
set arithabort off
set numeric_roundabort off
set ansi_warnings off
set ansi_padding off
set ansi_nulls off
set concat_null_yields_null off
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed

我认为这些设置来自此应用使用的旧版BDE。改变它们会有很多工作(我们正在努力重写这个应用程序)。

有没有办法创建索引,以便它可以使用具有这些设置的连接?

注意:

  • 我正在使用SQL Server 2012。
  • 我的Prod和非Prod SQL Server上都会发生此错误
  • 许多用户计算机上发生此错误

以下是我的订单表中当前的索引示例:

USE [UseMyDb]
GO

/****** Object:  Index [IX_AnotherIndex]    Script Date: 10/3/2013 2:56:49 PM ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_AnotherIndex] ON [OrderTable]
(
    [Sequence] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [SomethingIDontUnderstand]
GO

2 个答案:

答案 0 :(得分:2)

没有解决方法。见CREATE INDEX

  

过滤索引的必需SET选项

     

只要出现以下任何一种情况,就需要“必需值”列中的SET选项:

     

...

     
      
  • INSERT,UPDATE,DELETE或MERGE操作修改过滤索引中的数据。
  •   

因此,在发出UPDATE语句时必须设置正确的选项。创建索引时您的设置已经正确(或者您不会被允许)

答案 1 :(得分:0)

我无法重现这个问题所以我想这与创建索引时不符合设置的一些数据有关(遗产,嗯?去过那里!:))。如果是这种情况,您可以为要创建索引的连接指定一组不同的设置 。试试这个:

set quoted_identifier on
set ansi_nulls on
set concat_null_yields_null on

CREATE NONCLUSTERED INDEX [ix_ClientFilerTo0]
ON [ClientTable] ([Client])
INCLUDE ([ClientCol1],[ClientCol2],[ClientCol3] ... Many more columns)
WHERE Client = 0


CREATE NONCLUSTERED INDEX [IX_Client_Status]
ON [OrderTable] ([Client],[Status])
INCLUDE ([OrderCol1],[OrderCol2],[OrderCol3],[OrderCol4])
WHERE [Status] <= 7
GO    

来自delphi的连接仍将使用其设置,但这可以允许您创建索引。