Схема базы данных Проблема неоднозначного индекса Подсказка - PullRequest
3 голосов
/ 23 февраля 2011

Я только что импортировал базу данных в проект Visual Studio, используя проект базы данных Sql Server 2008. После решения многих проблем, выделенных Visual Studio, у меня осталось только 2, связанные с индексами хинтинга. 2 предупреждения (с вызывающими утверждениями):

SELECT a.FI, a.GD 
FROM [RME].[dbo].[BP_RN] a with(index(idx_GD))
WHERE GD.STWithin(@Geometry) = 1

SQL04151: Процедура: [dbo]. [Sp_TNFRME] содержит неразрешенную ссылку на объект. Либо объект не существует или ссылка неоднозначна потому что это может относиться к любому из следующие объекты: [dbo]. [BP_RN]. [idx_GD] или [DBO]. [Idx_GD].

и

SELECT a.I
FROM [dbo].[N] a with(index(idx_G))
WHERE a.G.STIntersects(@Geometry) = 1

SQL04151: Процедура: [dbo]. [Sp_DIOQE] содержит неразрешенную ссылку на объект. Либо объект не существует или ссылка неоднозначна потому что это может относиться к любому из следующие объекты: [dbo]. [idx_G] или [DBO]. [N]. [Idx_G].

Причина, по которой я перечислил оба этих списка по отдельности, заключается в том, что первый - это запрос к отдельной базе данных, и я не был уверен, означает ли это, что ее необходимо решить по-другому.

В любом случае, мой вопрос: как мне исправить эту ошибку или полностью квалифицировать подсказку, чтобы она больше не была двусмысленной?

Спасибо

1 Ответ

1 голос
/ 03 января 2013

есть способ избавиться от предупреждения в Visual Studio 2010 Ultimate, не избавляясь от подсказки, но вы должны изменить подсказку, чтобы использовать index_id вместо имени индекса.

Это работало с примером таблицы, которая содержала 3 столбца пространственных данных с индексом в каждом.

Пространственные индексы были созданы в проекте базы данных в VS2010 Ultimate из представления схемы после перехода в папку индексов втаблица, щелкнув правой кнопкой мыши папку индексов и выбрав добавить пространственный индекс.

Индекс_идентификатора каждого пространственного индекса зависит от порядка, в котором пространственные индексы создаются для одной и той же таблицы, а не от порядка создания каких-либо других.indexes.

Порядок создания индекса между пространственными индексами зависит от порядка сверху вниз, в котором они появляются в папке индексов представления схемы, поэтому в основном алфавитно-цифровой порядок словаря.

Значения index_id дляпространственные индексы всегда начинаются с 384000 и увеличиваются на1 для каждого дополнительно созданного индекса, в том порядке, в котором он был создан.

Для примера с 3 пространственными индексами я создал такие имена, как:

  1. TABLEPREFIX_SPATIAL384000_COLUMNNAME1
  2. TABLEPREFIX_SPATIAL384001_COLUMNNAME2
  3. TABLEPREFIX_SPATIAL384002_COLUMNNAME3

При отбрасывании и повторном создании индексов также создается один и тот же index_id для каждого индекса.

Итак, тогда I *

с:

WITH(INDEX(384000))

Visual Studio скомпилирован без жалоб, и запрос выполнялся, как и предполагалось, с использованием правильной подсказки индекса.

CAVEAT: если вам нужно обновить существующую базу данных, выВам придется удалять / переименовывать, а не переименовывать, и вам придется делать это в правильном порядке.Это не очень хороший обходной путь, но он избавится от предупреждения

Я попробовал немного более привлекательный подход, используя переменную команды sql:

WITH(INDEX([$(my_geographic_index_name)]))

К сожалению, это также привело кнежелательное предупреждение.

Удачи.

...