SQL Server 2005 - Declaração SQL para remover as chaves de cluster de tabelas com base em uma consulta em tablenames?
-
10-07-2019 - |
Pergunta
Eu estou tentando restaurar um backup de um banco de dados Microsoft Dynamics NAV, que infelizmente falha como ele tenta definir um CLUSTERED chave para as tabelas que já cluster chaves.
Em NAV, cada empresa no banco de dados obtém sua própria cópia das tabelas, prefixado com o nome da empresa, por exemplo, COMPANY$User_Setup
. Eu, portanto, como para remover qualquer tecla agrupado em uma determinada empresa, o que significa em qualquer tabela cujo nome começa com 'Empresa $'.
Alguém tem uma instrução SQL que poderia realizar isso?
Agradecemos antecipadamente!
Com os melhores cumprimentos, Martin
Solução
Você precisa fazê-lo como um cursor. Supondo que cada restrição PK é nomeado consistentemente e é baseado no nome da tabela, você seria capaz de fazer algo assim (não testado, por isso, pode conter erros de digitação ou erros de sintaxe 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
Se o seu de PK não são nomeados com base na tabela nome, então você vai ter que modificar isso para também consulta com base na SYSCONSTRAINTS ou sysindexes para obter o nome PK real.