Sql Unicode或ANSI中的le:
Sql Unicode或ANSI中的le:,sql,sql-server,delete-row,multi-table-delete,Sql,Sql Server,Delete Row,Multi Table Delete,向导将显示一个摘要,您可以使用它来验证所有内容是否符合要求,并通过单击“完成”来关闭该摘要。在我用于从SQL Server数据库中删除所有数据的脚本下方 ------------------------------------------------------------ /* Use database */ ------------------------------------------------------------- use somedatabase; GO ------
向导将显示一个摘要,您可以使用它来验证所有内容是否符合要求,并通过单击“完成”来关闭该摘要。在我用于从SQL Server数据库中删除所有数据的脚本下方
------------------------------------------------------------
/* Use database */
-------------------------------------------------------------
use somedatabase;
GO
------------------------------------------------------------------
/* Script to delete an repopulate the base [init database] */
------------------------------------------------------------------
-------------------------------------------------------------
/* Procedure delete all constraints */
-------------------------------------------------------------
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'sp_DeleteAllConstraints' AND type = 'P')
DROP PROCEDURE dbo.sp_DeleteAllConstraints
GO
CREATE PROCEDURE sp_DeleteAllConstraints
AS
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
GO
-----------------------------------------------------
/* Procedure delete all data from the database */
-----------------------------------------------------
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'sp_DeleteAllData' AND type = 'P')
DROP PROCEDURE dbo.sp_DeleteAllData
GO
CREATE PROCEDURE sp_DeleteAllData
AS
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
-----------------------------------------------
/* Procedure enable all constraints */
-----------------------------------------------
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'sp_EnableAllConstraints' AND type = 'P')
DROP PROCEDURE dbo.sp_EnableAllConstraints
GO
-- ....
-- ....
-- ....
sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all';
begin transaction
commit;
是的,可以用一行代码删除
SELECT 'TRUNCATE TABLE ' + d.NAME + ';'
FROM sys.tables d
WHERE type = 'U'
作为一个备选答案,如果您使用Visual Studio SSDT或可能的Red Gate Sql Compare,您可以简单地运行模式比较,编写脚本,删除旧数据库(可能先进行备份,以防需要该数据),然后使用比较工具创建的脚本创建新数据库。在一个非常小的数据库上,这可能需要更多的工作,而在一个非常大的数据库上,简单地删除数据库,然后处理数据库上可能存在的不同触发器和约束,会更快 节省一些时间/空间,尽可能使用TRUNCATE而不是DELETE, 在拥有庞大数据库的情况下,不会使日志文件膨胀 EXEC sp_MSForEachTable的ALTER TABLE?NOCHECK约束全部' 去 EXEC sp_MSForEachTable' 如果OBJECTPROPERTY(对象id(“”?“”),“”“TableHasForeignRef“”)=1 删除? 其他的 截断表?“ EXEC sp_MSForEachTable的ALTER TABLE?带有“全部检查约束”
GO结合现有答案中的所有优秀技巧以及其他一些技巧,我将此脚本组合在一起。它更全面,应该更高效 在执行删除步骤之前,请执行以下脚本:
- 禁用触发器(如果有任何on delete,则尤为重要) 触发器)
- 禁用约束检查
- 禁用非聚集索引(否则会逐行删除它们) (与桌子一起)
- 重建/启用所有索引(无论如何都是空的)
- 启用约束检查
- 启用触发器
- 重新设置标识列的种子
- 收缩数据库文件
use [your_database]
go
exec sp_MSforeachtable 'alter table ? disable trigger all'
go
exec sp_MSforeachtable 'alter table ? nocheck constraint all'
go
-- Disable enabled nonclustered indices
declare @script nvarchar(max)
declare cr cursor fast_forward read_only for
select 'alter index ' + quotename(i.name) + ' on ' + quotename(schema_name(t.schema_id))+'.'+ quotename(t.name) + ' disable'
from sys.indexes i inner join sys.tables t on i.object_id = t.object_id
where i.type_desc = 'nonclustered' and i.name is not null and i.is_disabled = 0;
open cr
fetch next from cr into @script
while @@fetch_status = 0
begin
execute sp_executesql @script
fetch next from cr into @script
end
close cr
deallocate cr
go
exec sp_MSforeachtable 'set quoted_identifier on; if objectproperty(object_id(''?''), ''TableHasForeignRef'') = 1 delete from ? with (tablock) else truncate table ?'
go
exec sp_MSforeachtable 'set quoted_identifier on; alter index all on ? rebuild';
go
exec sp_MSforeachtable 'alter table ? with check check constraint all'
go
exec sp_MSforeachtable 'alter table ? enable trigger all'
go
-- Re-seed identity columns
exec sp_MSforeachtable 'if objectproperty(object_id(''?''), ''TableHasIdentity'') = 1 dbcc checkident(''?'', reseed, 0)'
go
-- Shrink the database files
declare @db_name nvarchar(200) = db_name()
dbcc shrinkdatabase (@db_name, 0);
go
我认为这行不通。看来卡伦·德莱尼是无意中开始这个想法的。“必须删除引用约束才能截断表。”Martin我2秒钟前在Adventureworks数据库中运行了它,没有任何问题。在这里,它肯定不适用于我<代码>创建数据库测试;使用测试;创建表t1(i int主键)创建表t2(i int主键,p int引用t1)尽管被标记为答案,但这不起作用。在外键上设置nocheck约束不允许在这些表上运行truncate命令。您仍将收到阻止截断的错误。由于存在外键,此操作不起作用。我仍然不明白为什么它被接受为对我的回答。。我可以删除,但不能截断。在删除之后执行
EXEC sp_MSForEachTable'DBCC CHECKIDENT(“”?“”,RESEED,0)
,将所有标识列重置回0也很有意义。当您发现6行代码替换了100条delete语句时,这总是一天的良好开端!此方法在SQL 2014 Express上正常工作。别忘了禁用触发器。我遇到错误-删除失败,因为以下设置选项的设置不正确:“QUOTED_IDENTIFIER”…
。对于我工作过的人:EXEC sp_MSForEachTable'SET QUOTED_IDENTIFIER ON;“从中删除?”
这对我不起作用,递归查询以循环结束。也许是因为自尊。这给了我一个新表,每个表都有一个truncate语句。它实际上并没有删除任何内容,不幸的是,它首先解决了删除约束的问题。太糟糕了,我希望有一个这样的答案,而不使用sp_MSForEachTable(Azure SQL Server对我来说是不存在的)!对对。它为所有表创建截断脚本。使用该脚本删除表数据。此解决方案仅在不存在任何关系的情况下有效,因为它无法保证以正确的顺序删除表。此外,如果删除数据时有任何触发器,这可能会造成意外后果。有趣的脚本,它不使用Azure上缺少的未配置存储过程“sp_MSForEachTable”。但是,如果在[dbo]之外的另一个架构上有对象,则需要进行调整。请使用在Azure中创建sp_MSForEachTable。请小心,默认情况下,如果不转到“高级”按钮,将丢失索引等内容。
SET NOCOUNT ON
GO
SELECT 'USE [' + db_name() +']';
;WITH a AS
(
SELECT 0 AS lvl,
t.object_id AS tblID
FROM sys.TABLES t
WHERE t.is_ms_shipped = 0
AND t.object_id NOT IN (SELECT f.referenced_object_id
FROM sys.foreign_keys f)
UNION ALL
SELECT a.lvl + 1 AS lvl,
f.referenced_object_id AS tblId
FROM a
INNER JOIN sys.foreign_keys f ON a.tblId = f.parent_object_id
AND a.tblID <> f.referenced_object_id
)
SELECT
'Delete from ['+ object_schema_name(tblID) + '].[' + object_name(tblId) + ']'
FROM a
GROUP BY tblId
ORDER BY MAX(lvl),1
sp_msforeachtable 'ALTER TABLE ? ENABLE TRIGGER all'
begin transaction
commit;
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
GO
SELECT 'TRUNCATE TABLE ' + d.NAME + ';'
FROM sys.tables d
WHERE type = 'U'
use [your_database]
go
exec sp_MSforeachtable 'alter table ? disable trigger all'
go
exec sp_MSforeachtable 'alter table ? nocheck constraint all'
go
-- Disable enabled nonclustered indices
declare @script nvarchar(max)
declare cr cursor fast_forward read_only for
select 'alter index ' + quotename(i.name) + ' on ' + quotename(schema_name(t.schema_id))+'.'+ quotename(t.name) + ' disable'
from sys.indexes i inner join sys.tables t on i.object_id = t.object_id
where i.type_desc = 'nonclustered' and i.name is not null and i.is_disabled = 0;
open cr
fetch next from cr into @script
while @@fetch_status = 0
begin
execute sp_executesql @script
fetch next from cr into @script
end
close cr
deallocate cr
go
exec sp_MSforeachtable 'set quoted_identifier on; if objectproperty(object_id(''?''), ''TableHasForeignRef'') = 1 delete from ? with (tablock) else truncate table ?'
go
exec sp_MSforeachtable 'set quoted_identifier on; alter index all on ? rebuild';
go
exec sp_MSforeachtable 'alter table ? with check check constraint all'
go
exec sp_MSforeachtable 'alter table ? enable trigger all'
go
-- Re-seed identity columns
exec sp_MSforeachtable 'if objectproperty(object_id(''?''), ''TableHasIdentity'') = 1 dbcc checkident(''?'', reseed, 0)'
go
-- Shrink the database files
declare @db_name nvarchar(200) = db_name()
dbcc shrinkdatabase (@db_name, 0);
go