3

私は現在、10 年以上前に作成された古い Delphi アプリケーションに取り組んでいます。アプリケーションの一部には、アプリケーションで更新ステートメントを構築し、SQL Server に送信して実行するコンポーネントが含まれています。

私がしなければならなかった作業は、いくつかのクエリを高速化することでした。これを行うために、次のような 2 つのインデックスを追加しました。

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

私がそれをしたとき、私は次のエラーを得ました:

次の SET オプションの設定が正しくないため、UPDATE が失敗しました: ANSI_NULL、QUOTED_IDENTIFIER、CONCAT_NULL_YIELDS_NUL

これらの設定を index create ステートメントに追加しようとしましたが、役に立ちませんでした。

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 を使用しています。
  • このエラーは、本番環境と非本番環境の両方の SQL Server で発生します
  • このエラーは多くのユーザーのマシンで発生します

現在 Orders テーブルにあるインデックスの例を次に示します。

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 に答える