SQL Server 2005 - Instruction SQL pour supprimer les clés en cluster des tables basées sur une requête sur des noms de tables?

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

Question

J'essaie de restaurer une sauvegarde d'une base de données Microsoft Dynamics NAV, qui échoue malheureusement car elle tente de définir une CLUSTERED KEY pour les tables qui possèdent déjà des clés en cluster.

Dans NAV, chaque société de la base de données reçoit sa propre copie des tables, préfixée du nom de la société, par exemple. COMPANY $ User_Setup . Je souhaite donc supprimer toute clé en cluster sur une société donnée, ce qui signifie sur toute table dont le nom commence par 'Société $'.

Quelqu'un at-il une instruction SQL capable de le faire?

Merci d'avance!

Cordialement, Martin

Était-ce utile?

La solution

Vous devrez le faire en tant que curseur. En supposant que chaque contrainte PK est nommée de manière cohérente et est basée sur le nom de la table, vous pouvez faire quelque chose comme (non testé, donc susceptible de contenir des fautes de frappe ou des erreurs de syntaxe 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

Si vos PC ne sont pas nommés en fonction de nom_table, vous devrez alors modifier cette option afin que la requête soit également basée sur sysconstraints ou sysindexes pour obtenir le nom réel de la PK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top