Я пытаюсь удалить все таблицы в базе данных без необходимости делать это в правильном порядке. Из того, что я прочитал, запуск команды NOCHECK предотвратит проверку внешних ключей. Однако даже после этого я все еще получаю сообщение об ошибке при попытке удалить первую таблицу.
Не удалось удалить объект "dbo.TABLENAME", поскольку на него ссылается ограничение FOREIGN KEY.
Я уже видел, как на этот вопрос успешно ответили, поэтому я не понимаю, чем отличается то, что я делаю. Это работает на SQL Server 2008 R2.
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
Обновление 1
Я удалил код отключения ограничения вместо кода удаления ограничения, но он дает ошибку.
--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
На ограничение «[CONSTRAINT_NAME]» ссылается таблица «[TABLE_NAME]», ограничение внешнего ключа «[FK_NAME]».
Как я могу изменить этот запрос, чтобы я ориентировался только на ограничения FK?
exec sp_MSforeachtable @command1='alter table ? nocheck constraint all'
и удалите одну таблицу. Он должен работать. - person Jacob H   schedule 14.06.2017