我可以使用带有 where 子句的 truncate 命令吗?我需要从几个表中删除特定行。
如何从整个数据库中删除特定数据?
SELECT DimEmployee.[FirstName], DimEmployee.[LastName], [SalesOrderNumber], [ShipDateKey]
FROM DimEmployee
JOIN [FactResellerSales]
ON DimEmployee.[EmployeeKey] = [FactResellerSales].[ProductKey]
WHERE DimEmployee.[FirstName] like 'kevin%' <--have to truncate this specific name from entire DB
有没有其他方法可以从整个数据库中删除特定数据?
在我的数据库中有 172 个表。我想从整个数据库中删除特定名称及其对应的列。该名称分布在整个数据库中,因此我想一次性删除它,而不是转到每个表并单独删除它。
不,Truncate 不能与
WHERE
子句一起使用。截断只是释放属于表(或分区)及其索引的所有页面。来自BOL:
如果您正在寻找一种更有效的方式来删除数据,我会从这里开始。
sql server 中有三种删除方法:
Truncate
,Delete
,Drop
DROP、TRUNCATE 是 DDL 命令 (DROP 用于删除表、列、约束等对象,但不是行)
DELETE 是一个 DML 命令。
“TRUNCATE 从表中删除所有行而不记录单个行的删除。TRUNCATE TABLE 类似于没有 WHERE 子句的 DELETE 语句;但是,TRUNCATE TABLE 更快并且使用更少的系统和事务日志资源......”阅读更多
您必须使用动态 sql 创建命令并执行它:(类似于此查询)
有用的网址
Truncate 是一个在页面级别工作的 ddl 命令。只需在分区和对象级别释放页面。而 delete 是一个 dml 命令,在行级别工作。在页面内,它搜索行偏移量并将记录标记为已删除。
因此,根据上述语句,您不能将 truncate 语句与查询一起使用。
where 子句可以与 Truncate 命令一起使用吗
每个 SQL 开发人员都希望通过查询完全控制数据库。因此,他们开始思考 SQL 语法之外的问题。一个这样的误解是 where 子句是否与 Truncate 命令一起使用来执行某些条件操作。
例如,如果有人想使用 Truncate 命令删除上周(7 天)的所有记录。虽然这可以使用“从 table_name where 条件中删除”来完成,但使用 truncate 是因为它比 Delete 查询更快。
“可以将 where 子句与截断命令一起使用”问题的答案是肯定的。截断语句意味着 All or Nothing。这意味着要么删除表中的所有记录,要么不删除任何记录。
截断表
TRUNCATE TABLE 是 SQL 中的一条语句,它通过释放表使用的数据页来非常快速地删除表中的所有记录。重新分配数据页减少了记录已完成删除的资源开销,以及获取的锁的数量。TRUNCATE TABLE 查询语句删除的记录无法恢复,因此在执行 TRUNCATE TABLE 查询之前需要非常小心。