3

我今天正在处理一个 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 失败,因为以下 SET 选项的设置不正确: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
4

2 回答 2

3

没有解决办法。见CREATE INDEX

过滤索引所需的 SET 选项

每当出现以下任何情况时,都需要“必需值”列中的 SET 选项:

...

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

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

于 2013-10-11T07:16:21.910 回答
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 的连接仍将使用其设置,但这可以让您创建索引。

于 2013-10-10T07:54:15.557 回答