DROP TABLE (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的仓库

删除一个或多个表定义以及这些表的所有数据、索引、触发器、约束和权限规范。 任何引用已删除表的视图或存储过程都必须使用 DROP VIEWDROP PROCEDURE 显式删除。 若要报告表的依赖关系,请使用 sys.dm_sql_referencing_entities

Transact-SQL 语法约定

语法

-- Syntax for SQL Server, Azure SQL Database, Warehouse in Microsoft Fabric
  
DROP TABLE [ IF EXISTS ] { database_name.schema_name.table_name | schema_name.table_name | table_name } [ ,...n ]  
[ ; ]  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
  
DROP TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[;]  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

自变量

database_name
要在其中创建表的数据库的名称。

Azure SQL 数据库支持由三部分组成的名称格式 database_name.[schema_name].object_name,其中 database_name 为当前数据库,database_name 为 tempdb,object_name 以 # 开头。 Azure SQL 数据库不支持由四部分组成的名称。

IF EXISTS
适用范围:SQL Server(SQL Server 2016 (13.x) 到当前版本)。

有条件地删除表(仅当其已存在时)。

schema_name
表所属架构的名称。

table_name
要删除的表的名称。

备注

不能使用 DROP TABLE 删除被 FOREIGN KEY 约束引用的表。 必须先删除引用 FOREIGN KEY 约束或引用表。 如果要在同一个 DROP TABLE 语句中删除引用表以及包含主键的表,则必须先列出引用表。

可以在任何数据库中删除多个表。 如果一个要删除的表引用了另一个也要删除的表的主键,则必须先列出包含该外键的引用表,然后再列出包含要引用的主键的表。

删除表时,表的规则或默认值将被解除绑定,与该表关联的任何约束或触发器将被自动删除。 如果要重新创建表,则必须重新绑定相应的规则和默认值,重新创建某些触发器,并添加所有必需的约束。

如果使用 DELETE tablename 删除表中的所有行或使用 TRUNCATE TABLE 语句,则在表被删除之前,表将一直存在

删除使用了超过 128 个区的大型表和索引时,需要分两个单独的阶段:逻辑和物理阶段。 在逻辑阶段中,对表使用的现有分配单元进行标记以便释放,并对其进行锁定,直到事务提交为止。 在物理阶段,标记为要释放的 IAM 页被成批地物理删除。

如果删除的表包含带有 FILESTREAM 属性的 VARBINARY (MAX) 列,则不会删除在文件系统中存储的任何数据。

删除账本表后,也会删除其依赖对象(历史记录表和账本视图)。 无法直接删除历史记录表或账本视图。 系统在删除账本表及其依赖对象时强制实施软删除语义,它们不会真正被删除,而是在系统目录视图中被标记为“已删除”并重命名。 有关详细信息,请参阅账本注意事项和限制

重要

不应在同一个批处理中对同一个表执行 DROP TABLE 和 CREATE TABLE。 否则,可能出现意外错误。

权限

需要拥有该表所属架构的 ALTER 权限、该表的 CONTROL 权限或 db_ddladmin 固定数据库角色中的成员身份。

如果该语句删除了一个分类帐表,则需要 ALTER LEDGER 权限。

示例

A. 删除当前数据库中的表

以下示例将从当前数据库中删除 ProductVendor1 表及其数据和索引。

DROP TABLE ProductVendor1 ;  

B. 删除其他数据库中的表

以下示例将删除 AdventureWorks2022 数据库中的 SalesPerson2 表。 可以在服务器实例上的任何数据库中执行此示例。

DROP TABLE AdventureWorks2022.dbo.SalesPerson2 ;  

C. 删除临时表

以下示例将创建一个临时表,测试该表是否存在,删除该表,然后再次测试该表是否存在。 此示例不使用 IF EXISTS 语法,该语法适用于 SQL Server 2016 (13.x) 及以上版本

CREATE TABLE #temptable (col1 INT);  
GO  
INSERT INTO #temptable  
VALUES (10);  
GO  
SELECT * FROM #temptable;  
GO  
IF OBJECT_ID(N'tempdb..#temptable', N'U') IS NOT NULL   
DROP TABLE #temptable;  
GO  
--Test the drop.  
SELECT * FROM #temptable;  

D. 使用 IF EXISTS 删除表

适用范围:SQL Server(SQL Server 2016 (13.x) 到当前版本)。

以下示例创建名为 T1 的表。 然后,第二条语句删除表。 第三条语句不执行任何操作,因为此表已删除,但这不会引起错误。

CREATE TABLE T1 (Col1 INT);  
GO  
DROP TABLE IF EXISTS T1;  
GO  
DROP TABLE IF EXISTS T1;  

另请参阅

ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
sp_help (Transact-SQL)
sp_spaceused (Transact-SQL)
TRUNCATE TABLE (Transact-SQL)
DROP VIEW (Transact-SQL)
DROP PROCEDURE (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL)