首页 > 解决方案 > 删除表中除系统版本(历史)表之外的所有数据

问题描述

我正在尝试删除除系统版本之外的所有表中的所有数据(因为我们不能)。这是在运行每个测试之前清除数据的集成测试的一部分。

以下语句返回1历史表(我们无法在它们上执行delete from的那些。

SELECT OBJECTPROPERTY(OBJECT_ID('table_name'), 'TableTemporalType')

所以我的尝试如下:

-- Remove check constraints
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
-- Delete data
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; IF OBJECTPROPERTY(OBJECT_ID(''?''), ''TableTemporalType'') != 1 DELETE FROM ?'
-- Restore check constraints
EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL'

但是,我仍然收到错误消息:

Cannot delete rows from a temporal history table 'dbo.table_name'.

我不确定我做错了什么!

任何提示表示赞赏!

标签: sql-server

解决方案


我会通过使用 sys.tables 生成一些动态 sql 来做到这一点。这样的事情应该非常接近你想要做的事情。

declare @sql nvarchar(max) = ''

select @sql = @sql + 'delete ' + name + ';'
from sys.tables
where temporal_type = 0

select @sql
--uncomment the line below when you are ready to blow away all your data
--exec sp_executesql @sql

推荐阅读