SQL Server 2005 - оператор SQL для удаления кластеризованных ключей из таблиц на основе запроса имен таблиц? - PullRequest
1 голос
/ 03 августа 2009

Я пытаюсь восстановить резервную копию базы данных Microsoft Dynamics NAV, которая, к сожалению, не работает, так как она пытается установить ключ CLUSTERED для таблиц, которые уже имеют кластерные ключи.

В NAV каждая компания в базе данных получает собственную копию таблиц с префиксом названия компании, например, COMPANY$User_Setup. Поэтому я хотел бы удалить любой кластеризованный ключ для данной компании, что означает для любой таблицы, имя которой начинается с «Company $».

Кто-нибудь получил оператор SQL, который мог бы выполнить это?

Заранее спасибо!

С наилучшими пожеланиями, Martin

1 Ответ

1 голос
/ 03 августа 2009

Вам нужно будет сделать это как курсор. Предполагая, что каждое ограничение PK названо последовательно и основано на имени таблицы, вы можете сделать что-то вроде (не проверено, поэтому может содержать опечатки или ошибки синтаксиса vauge):

DECLARE mycursor CURSOR FOR SELECT name FROM sysobjects WHERE name LIKE 'Company$%'

OPEN CURSOR
FETCH NEXT FROM mycursor INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = N'ALTER TABLE QUOTENAME(' + @tablename + ') DROP CONSTRAINT PK_' + @tablename 
    EXEC sp_ExecuteSQL @sql
    FETCH NEXT FROM mycursor INTO @tablename
END

CLOSE CURSOR
DEALLOCATE CURSOR

Если ваши PK не названы на основе имени таблицы, вам придется изменить это, чтобы также запрашивать на основе sysconstraints или sysindexes для получения действительного имени PK.

...