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

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

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

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

Мне удалось создать индекс, используя этот код в окне запроса:

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

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


person Craig Smith    schedule 23.03.2013    source источник
comment
Опубликуйте точный код, который вы пытаетесь.   -  person Remus Rusanu    schedule 23.03.2013
comment
это точный код и метод, использующий студию управления, я делаю обновление для этого, я смог создать его, используя прямой статус sql.   -  person Craig Smith    schedule 23.03.2013
comment
Привет @marc_s, почему ты изменил сообщение об ошибке на курсив? Мне в таком формате читать сложнее, а не легче. Я полагаю, вы найдете обратное?   -  person Aaron Bertrand    schedule 23.03.2013
comment
@AaronBertrand: это просто стиль, который я видел, когда многие модераторы использовали некоторое время назад, и я принял его. Так не должно быть - я просто хотел убедиться, что ошибка четко выделяется из остальной части вопроса.   -  person marc_s    schedule 23.03.2013
comment
@marc_s ах, хорошо, вам не нужно было менять его обратно, было просто любопытно, действительно ли вам было легче читать. Что касается выделения, на мобильных устройствах он по-прежнему на белом фоне, но на десктопе он окрашен как код, но без шрифта фиксированной ширины.   -  person Aaron Bertrand    schedule 23.03.2013


Ответы (1)


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

person Aaron Bertrand    schedule 23.03.2013
comment
Да, он должен просто предупреждать, если sql.StartsWith("where "). - person usr; 23.03.2013
comment
круто, ошибка в книге. Я посмотрел на индекс, который я создал с помощью sql в графическом интерфейсе, и увидел, что ([eMail] IS NOT NULL) находится на странице фильтра. Спасибо - person Craig Smith; 23.03.2013