Ich versuche, alle Tabellen in einer Datenbank zu löschen, ohne sie in der richtigen Reihenfolge ausführen zu müssen. Von dem, was ich gelesen habe, verhindert der NOCHECK-Befehl, dass Fremdschlüssel überprüft werden. Aber auch nach dem Ausführen bekomme ich immer noch einen Fehler beim Versuch, die erste Tabelle zu löschen.T-SQL Alle Tabellen löschen
konnte nicht Objekt ‚dbo.TABLENAME‘ fallen, weil es
von eine FOREIGN KEY-Einschränkung verwiesen wird
ich diese Frage vor erfolgreich beantwortet gesehen haben, so verstehe ich nicht, was mit dem, was anders ist Ich mache. Dies wird auf SQL Server 2008 R2 ausgeführt.
BEGIN TRANSACTION
--get current list of tables
SELECT QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) as 'Dropped Table'
FROM sys.tables t
JOIN sys.schemas s
ON t.[schema_id] = s.[schema_id]
WHERE t.type = 'U'
--disable constraint checking in all tables
DECLARE @sql NVARCHAR(max)
SET @sql = ''
SELECT @sql += ' ALTER TABLE ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + ' NOCHECK CONSTRAINT ALL; '
FROM sys.tables t
JOIN sys.schemas s
ON t.[schema_id] = s.[schema_id]
WHERE t.type = 'U'
select @sql
Exec sp_executesql @sql
--disable all constraints (this also didn't work)
--EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
--drop all tables
SET @sql = ''
SELECT @sql += ' DROP TABLE ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; '
FROM sys.tables t
JOIN sys.schemas s
ON t.[schema_id] = s.[schema_id]
WHERE t.type = 'U'
select @sql
Exec sp_executesql @sql
--check current list, should be empty
SELECT QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) as 'Tables'
FROM sys.tables t
JOIN sys.schemas s
ON t.[schema_id] = s.[schema_id]
WHERE t.type = 'U'
ROLLBACK TRANSACTION
Update 1
entfernte ich die Constraint-Code anstelle der Einschränkung fallen Code deaktivieren, aber es gibt und Irrtum.
--drop all constraints
DECLARE @sql NVARCHAR(max)
SET @sql = ''
SELECT @sql += ' ALTER TABLE ' +QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + ' DROP CONSTRAINT ' + ctu.CONSTRAINT_NAME + ';'
FROM sys.tables t
JOIN sys.schemas s
ON t.[schema_id] = s.[schema_id]
INNER JOIN EOS_DEV.INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as ctu
ON ctu.TABLE_SCHEMA = s.name AND ctu.TABLE_NAME = t.name
WHERE t.type = 'U'
Exec sp_executesql @sql
Die Einschränkung '[CONSTRAINT_NAME]' durch die Tabelle verwiesen wird '[TABLE_NAME]', Fremdschlüssel '[FK_NAME]
Wie kann ich diese Abfrage ändern, damit ich nur Ziel-FK-Bedingungen?
Ich würde versuchen, indem Sie alle Einschränkungen zuerst fallen lassen und dann versuchen, Tabellen fallen zu lassen. – Praveen
@Praveen ist nicht die ganze Frage, wie man die Tabellen mit NOCHECK löscht, ohne die Beschränkungen fallen zu lassen? Ich denke der Benutzer ist sich bewusst, dass sie die Einschränkungen zuerst fallen lassen können ... –
Haben Sie es mit nur einem Tisch probiert? Führen Sie 'exec sp_MSforeachtable @ command1 = 'alter table aus? nocheck constraint all'' und lasst einen Tisch fallen. Es sollte funktionieren. –