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';
    
  • 运行此脚本:(取自此Thanke you@sqlnemage)

  • 提交更改:

    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,则尤为重要) 触发器)
    • 禁用约束检查
    • 禁用非聚集索引(否则会逐行删除它们) (与桌子一起)
    对于删除步骤,它将尽可能地截断(快得多),或者使用tablock提示进行删除(tablock仅对堆表有帮助,而且由于我们无论如何都会收缩文件,因此它可能不会在此处添加任何内容)

    删除步骤后,脚本将:

    • 重建/启用所有索引(无论如何都是空的)
    • 启用约束检查
    • 启用触发器
    • 重新设置标识列的种子
    • 收缩数据库文件
    从数据库中删除所有数据:

    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