4

フィルター処理された非クラスター化インデックスを作成しようとしています。IndexesGUIで、インデックスが必要なテーブルのフォルダーを右クリックします。インデックスを適用する列を追加し、フィルター ページをクリックして次のステートメントを追加しますWHERE eMail IS NOT NULL。[OK] をクリックすると、次のエラーが表示されます。

インデックス 'fix_Email' の作成に失敗しました。(Microsoft.SqlServer.Smo)
キーワード 'WHERE' 付近の構文が正しくありません。
キーワード「with」付近の構文が正しくありません。このステートメントが共通テーブル式、xmlnamespaces 句、または変更追跡コンテキスト句である場合、前のステートメントはセミコロンで終了する必要があります。(Microsoft SQL Server、エラー: 156)

これは、SQL Server 2008 の管理に関する本から直接引用したものです。SQL 2012 Express をインストールして、2 つの違いを確認しました。前の例はすべて機能し、クラスター化インデックス、非クラスター化インデックス、およびカバリング インデックスを作成しました。これは本の問題ですか、SQL Server 2012 の問題ですか、それとも Express エディションの問題ですか? ステートメントの最後にあるエラー メッセージで示唆されているように、セミコロンを配置しようとしましたWHEREが、何もしませんでした。

クエリ ウィンドウで次のコードを使用して、インデックスを作成できました。

CREATE NONCLUSTERED INDEX fix_Prices
ON dbo.Customers (eMail)
WHERE eMail IS NOT NULL;

これは機能するのに、Management Studio GUI を使用しないのはなぜですか?

4

1 に答える 1

5

WHEREダイアログにフィルター式を入力するとき、自分で句を追加しません。次のように入力します。

eMail IS NOT NULL

それ以外の場合、 で開始WHEREすると、2 つのWHERE句ができます (最後にセミコロンを追加しないでください。インデックス作成ステートメントの残りの部分が中断されるためです)。これは、列を追加し、フィルター条件を入力して、ボタンをクリックすると表示されScriptます。新しいクエリ ウィンドウを選択します。次のようなものが表示されます。

USE [yourdb]
GO
SET ANSI_PADDING ON
GO
CREATE NONCLUSTERED INDEX [fix_Prices] ON [dbo].[Customers]
(
[eMail] ASC
)
WHERE WHERE eMail IS NOT NULL
------^^^^^ OOPS!

WITH (...index options...)
GO

間違いなく、SSMS は冗長なWHERE句を削除したり、IntelliSense を使用してスクリプトがどのように表示されるかを示したり、このような単純な間違いを簡単に指摘したりするのに十分スマートである必要がありますが、率直に言って、これよりもはるかに重要なバグを修正する必要があります。(つまり、2008 年に、彼らはセミコロンで終わらないステートメントの非推奨を発表しました。私は長い間、全員が参加できるように努めてきました。上の 1 つのセミコロンが見えますか? ? いいえ。)

于 2013-03-23T14:24:40.897 に答える