Sql server T-SQL删除所有表

Sql server T-SQL删除所有表,sql-server,tsql,sql-server-2008-r2,foreign-keys,drop-table,Sql Server,Tsql,Sql Server 2008 R2,Foreign Keys,Drop Table,我正在尝试删除数据库中的所有表,而不必按正确的顺序执行。据我所知,运行NOCHECK命令将防止检查外键。然而,即使在运行该命令之后,我仍然会在尝试删除第一个表时出错 无法删除对象“dbo.TABLENAME”,因为它被引用 外键约束 我以前见过这个问题被成功地回答过,所以我不明白我现在所做的有什么不同。这是在SQL Server 2008 R2上运行的 BEGIN TRANSACTION --get current list of tables SELECT QUOTENAME(s.NAME)

我正在尝试删除数据库中的所有表,而不必按正确的顺序执行。据我所知,运行NOCHECK命令将防止检查外键。然而,即使在运行该命令之后,我仍然会在尝试删除第一个表时出错

无法删除对象“dbo.TABLENAME”,因为它被引用 外键约束

我以前见过这个问题被成功地回答过,所以我不明白我现在所做的有什么不同。这是在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约束?

将FK设置为NOCHECK将允许您插入、更新或删除违反该约束的行。它不允许删除或截断目标表。 例如:


你非得让这件事变得这么难吗?为什么不恢复一个空数据库(或者只包含您的模式和任何需要的“默认”行的数据库)

谢谢大家的帮助。我更新了我的查询,现在可以确认它能够不加区别地删除所有表。我还添加了一个部分来删除所有存储的进程,以增加一点味道

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'

--drop all constraints
DECLARE @sql NVARCHAR(max)
SET @sql = ''
SELECT @sql += ' ALTER TABLE ' +QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME + ';'
FROM sys.tables t
    JOIN sys.schemas s
        ON t.[schema_id] = s.[schema_id]
    INNER JOIN EOS_DEV.INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
        ON tc.TABLE_SCHEMA = s.name AND tc.TABLE_NAME = t.name
WHERE t.type = 'U'
    AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
Exec sp_executesql @sql

--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'
Exec sp_executesql @sql

--drop all stored procs
SET @sql = ''
SELECT @sql += 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + ']'
FROM sys.procedures as p 
where p.is_ms_shipped = 0
    AND p.type = 'P'
Exec sp_executesql @sql

ROLLBACK TRANSACTION

我会先删除所有约束,然后再删除表。@Praveen的问题不在于如何在不删除约束的情况下使用NOCHECK删除表吗?我认为用户意识到他们可以先删除约束……您是否尝试过只使用一个表?运行exec sp_MSforeachtable@command1='alter table?nocheck constraint all'并删除一个表。应该可以。我会尝试设置一个循环,以继续运行exec spmsforeachtable“Drop Table”,检查是否返回0的错误。每次迭代都会删除引用表。从未实际编写过循环,但通常如果我想删除所有表,我只会一遍又一遍地执行该命令,最终它们都会被删除。我缺乏访问权限,不想为开发人员编写正式的实施计划。感谢您澄清了问题所在,但这并不是一个解决方案。
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'

--drop all constraints
DECLARE @sql NVARCHAR(max)
SET @sql = ''
SELECT @sql += ' ALTER TABLE ' +QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME + ';'
FROM sys.tables t
    JOIN sys.schemas s
        ON t.[schema_id] = s.[schema_id]
    INNER JOIN EOS_DEV.INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
        ON tc.TABLE_SCHEMA = s.name AND tc.TABLE_NAME = t.name
WHERE t.type = 'U'
    AND tc.CONSTRAINT_TYPE = 'FOREIGN KEY'
Exec sp_executesql @sql

--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'
Exec sp_executesql @sql

--drop all stored procs
SET @sql = ''
SELECT @sql += 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + ']'
FROM sys.procedures as p 
where p.is_ms_shipped = 0
    AND p.type = 'P'
Exec sp_executesql @sql

ROLLBACK TRANSACTION