Создать отфильтрованный индекс не работает в SQL Server 2012 Express

Я пытаюсь создать отфильтрованный некластерный индекс. В графическом интерфейсе я щелкаю правой кнопкой мыши папку Indexes таблицы, в которой я хочу индекс. Добавьте столбец, в котором должен применяться индекс, затем щелкните страницу фильтра, чтобы добавить этот оператор: WHERE eMail IS NOT NULL. Нажмите кнопку ОК, и у меня появится эта ошибка:

  

Создать не удалось для индекса 'fix_Email'. (Microsoft.SqlServer.Smo)
  Неверный синтаксис рядом с ключевым словом "ГДЕ".
  Неверный синтаксис рядом с ключевым словом «с». Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой. (Microsoft SQL Server, ошибка: 156)

Это прямо из книги по администрированию SQL Server 2008. Я установил SQL 2012 Express, чтобы увидеть, какие различия будут между ними. Все предыдущие примеры работали, создавая кластерные индексы, некластеризованные и охватывающие индексы. Это проблема с книгой или SQL Server 2012 или, может быть, Express Edition? Я попытался поместить точку с запятой в соответствии с сообщением об ошибке в конце моего WHERE, но ничего не получилось.

Мне удалось создать индекс с помощью этого кода в окне запроса:

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

почему это работает, но не использует графический интерфейс Management Studio?

4 голоса | спросил Craig Smith 23 MarpmSat, 23 Mar 2013 18:07:24 +04002013-03-23T18:07:24+04:0006 2013, 18:07:24

1 ответ


0

Когда вы вводите выражение фильтра в диалоговом окне, вы не добавляете предложение WHERE самостоятельно. Просто введите:

eMail IS NOT NULL

В противном случае, если вы ведете с WHERE, у вас будет два 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 году они объявили не рекомендуется использовать операторы, которые не заканчиваются точкой с запятой , и Я давно пытаюсь привлечь всех на борт . Вы видите одну точку с запятой выше? Нет.)

ответил Aaron Bertrand 23 MarpmSat, 23 Mar 2013 18:24:40 +04002013-03-23T18:24:40+04:0006 2013, 18:24:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132