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

StackOverflow https://stackoverflow.com/questions/1222432

Вопрос

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

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

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

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

С уважением, Мартин

Это было полезно?

Решение

Вам нужно будет сделать это как курсор. Предполагая, что каждое ограничение 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top