SQL Server 2005 - SQL-Anweisung zu gruppierten Schlüssel aus Tabellen entfernen basierend auf einer Abfrage auf Tabellennamen?
-
10-07-2019 - |
Frage
Ich versuche, eine Sicherung einer Microsoft Dynamics NAV-Datenbank wiederherstellen, die leider nicht, da es eine CLUSTERED KEY für die Tabellen zu setzen versucht, die Schlüssel bereits gruppierte.
In NAV, jedes Unternehmen in der Datenbank erhält eine eigene Kopie der Tabellen mit dem Präfix der Namen der Firma, zum Beispiel COMPANY$User_Setup
. Ich würde daher gerne jeden gruppierte Schlüssel zu einem bestimmten Unternehmen zu entfernen, die auf einer Tabelle bedeutet beginnt, dessen Name mit ‚Firma $‘.
Hat jemand bekam eine SQL-Anweisung, die diese durchführen könnte?
Vielen Dank im Voraus!
Mit freundlichen Grüßen, Martin
Lösung
Sie müssen es als Cursor tun. Unter der Annahme, jeder PK Constraint consistantly benannt und basiert auf dem Tabellennamen, würden Sie in der Lage sein, etwas zu tun, wie (nicht getestet, so kann Tippfehler oder vauge Syntaxfehler enthalten):
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
Wenn sie Ihre PK nicht auf Tabellennamen basieren nennen, dann werden Sie haben, dies zu ändern, auch auf sysconstraints oder sysindexes basierend abzufragen, um die tatsächlichen PK-Namen zu erhalten.