SQL Server 2005 - Declaração SQL para remover as chaves de cluster de tabelas com base em uma consulta em tablenames?

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

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top