Индекс сброса SQL в другой базе данных - PullRequest
4 голосов
/ 01 июня 2010

При попытке оптимизировать сценарии SQL мне было рекомендовано добавить индексы.

Какой самый простой способ указать, к какой базе данных должен быть индекс?

IF EXISTS (SELECT * FROM sysindexes WHERE NAME = 'idx_TableA')  
  DROP INDEX TableA.idx_TableA 

IF EXISTS (SELECT * FROM sysindexes WHERE NAME = 'idx_TableB')  
  DROP INDEX TableB.idx_TableB 

В приведенном выше коде таблица A находится в DB-A, а таблица B - в DB-B.

При изменении DROP INDEX TableA.idx_TableA на DROP INDEX DB-A.dbo.TableA.idx_TableA

появляется следующая ошибка
Msg 166, Level 15, State 1, Line 2
'DROP INDEX' does not allow specifying the database name as a prefix to the object name.

Любые мысли приветствуются.

Ответы [ 5 ]

7 голосов
/ 01 июня 2010

Если у вас есть разрешения, другой способ - с EXEC ('sql'). Также обратите внимание, что при запросе к sys.indexes вам необходимо добавить префикс к имени базы данных:

IF EXISTS (SELECT * FROM [DB-A].sys.indexes WHERE name = 'idx_TableA')
  EXEC('USE [DB-A]; DROP INDEX TableA.idx_TableA')

IF EXISTS (SELECT * FROM [DB-B].sys.indexes WHERE name = 'idx_TableB')
  EXEC('USE [DB-B]; DROP INDEX TableB.idx_TableB')
7 голосов
/ 01 июня 2010

Команды удаления должны использовать USE-статистику, если вы собираетесь удалить индекс из другой базы данных.

USE [DatabaseName]
Drop Index [IndexName]
4 голосов
/ 18 июня 2011

Если вы не можете выдать USE:

EXEC [DB-A].dbo.sp_executesql N'DROP INDEX TableA.idx_TableA'
0 голосов
/ 24 декабря 2014

Используйте синтаксис DROP INDEX ... ON. Это поддерживает указание базы данных и имени таблицы: http://msdn.microsoft.com/en-us/library/ms176118.aspx. Сокращенный синтаксис, который вы использовали, устарел и «будет удален в будущей версии Microsoft SQL Server».

IF EXISTS (SELECT * FROM [DB-A].sys.indexes WHERE NAME = 'idx_TableA')  
  DROP INDEX [idx_TableA] ON [DB-A].dbo.[TableA]

IF EXISTS (SELECT * FROM [DB-B].sys.indexes WHERE NAME = 'idx_TableB')  
  DROP INDEX [idx_TableB] ON [DB-B].dbo.[TableB]
0 голосов
/ 03 апреля 2014

Вы могли бы также поставить имя индекса.

IF EXISTS (select 1 from sysindexes i, sysobjects o where o.name = 'idx_TableA'
and o.id = i.id and i.name='indexname')
     exec('use [db-a]; drop index idx_TableA.indexname')
     SELECT 'Drop the index'
else
     SELECT 'Index not found'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...