代码之家  ›  专栏  ›  技术社区  ›  AndreyAkinshin

删除SQL Server数据库中的所有数据

  •  100
  • AndreyAkinshin  · 技术社区  · 15 年前

    9 回复  |  直到 11 年前
        1
  •  200
  •   Ryan Kirkman    11 年前

    SqlMenage的解决方案对我来说很有效,只是对数据的删除方式做了一些微调- DELETE FROM 而不是 TRUNCATE .

    -- disable referential integrity
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
    GO 
    
    EXEC sp_MSForEachTable 'DELETE FROM ?' 
    GO 
    
    -- enable referential integrity again 
    EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL' 
    GO
    
        2
  •  38
  •   SQLMenace    15 年前

    通常我只使用未记录的proc sp\MSForEachTable

    -- disable referential integrity
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
    GO 
    
    EXEC sp_MSForEachTable 'TRUNCATE TABLE ?' 
    GO 
    
    -- enable referential integrity again 
    EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 
    GO
    

    另请参见: Delete all data in database (when you have FKs)

        3
  •  19
  •   Harpal    12 年前
    /* Drop all non-system stored procs */
    DECLARE @name VARCHAR(128)
    DECLARE @SQL VARCHAR(254)
    
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])
    
    WHILE @name is not null
    BEGIN
        SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped Procedure: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
    END
    GO
    
    /* Drop all views */
    DECLARE @name VARCHAR(128)
    DECLARE @SQL VARCHAR(254)
    
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])
    
    WHILE @name IS NOT NULL
    BEGIN
        SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped View: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
    END
    GO
    
    /* Drop all functions */
    DECLARE @name VARCHAR(128)
    DECLARE @SQL VARCHAR(254)
    
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])
    
    WHILE @name IS NOT NULL
    BEGIN
        SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped Function: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
    END
    GO
    
    /* Drop all Foreign Key constraints */
    DECLARE @name VARCHAR(128)
    DECLARE @constraint VARCHAR(254)
    DECLARE @SQL VARCHAR(254)
    
    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
    
    WHILE @name is not null
    BEGIN
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        WHILE @constraint IS NOT NULL
        BEGIN
            SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
            EXEC (@SQL)
            PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
            SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        END
    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
    END
    GO
    
    /* Drop all Primary Key constraints */
    DECLARE @name VARCHAR(128)
    DECLARE @constraint VARCHAR(254)
    DECLARE @SQL VARCHAR(254)
    
    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
    
    WHILE @name IS NOT NULL
    BEGIN
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        WHILE @constraint is not null
        BEGIN
            SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
            EXEC (@SQL)
            PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
            SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
        END
    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
    END
    GO
    
    /* Drop all tables */
    DECLARE @name VARCHAR(128)
    DECLARE @SQL VARCHAR(254)
    
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])
    
    WHILE @name IS NOT NULL
    BEGIN
        SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
        EXEC (@SQL)
        PRINT 'Dropped Table: ' + @name
        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
    END
    GO
    
        4
  •  16
  •   SchmitzIT Mitch    12 年前

    我知道这已经晚了,但我同意AlexKuznetsov的建议,编写数据库脚本,而不是从表中清除数据。如果 TRUNCATE 解决方案将不起作用,并且您碰巧有大量数据,正在发布(记录) DELETE 语句可能需要很长时间,并且您将留下尚未重新设定种子的标识符(即 INSERT 语句放入带有 IDENTITY 列将获得50000的ID,而不是1)。

    要编写整个数据库的脚本,请在SSMS中,右键单击该数据库,然后选择 TASKS Generate scripts :

    enter image description here

    Next 要跳过向导打开屏幕,然后选择要编写脚本的对象,请执行以下操作:

    enter image description here

    Set scripting options 屏幕上,您可以选择脚本的设置,例如是为所有对象生成一个脚本,还是为单个对象生成单独的脚本,以及是以Unicode还是ANSI格式保存文件:

    enter image description here

        5
  •  8
  •   marc_s MisterSmith    11 年前
    1. 首先,您必须禁用所有触发器:

      sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all';
      
    2. 运行此脚本:(取自此 post 谢谢@sqlmenage)

      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
      

    DELETE 以适当的顺序陈述。从引用的表开始,然后引用表

    1. 复制 DELETE FROM

    2. 启用触发器

      sp_msforeachtable 'ALTER TABLE ? ENABLE TRIGGER all'
      
    3. 提交更改:

      begin transaction
      commit;
      
        6
  •  5
  •   A-K    15 年前

    通常,编写数据库中所有对象的脚本并创建一个空对象(从表中删除或截断对象)要快得多。

        7
  •  3
  •   benahm    8 年前

    下面是我用来从SQLServer数据库中删除所有数据的脚本

    ------------------------------------------------------------
    /* 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
    -- ....
    -- ....
    -- ....
    
        8
  •  1
  •   Konstantin Zadiran    10 年前
    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
    
        9
  •  0
  •   dmoore1181    6 年前

        10
  •  -1
  •   WhatsThePoint    7 年前

    是的,可以用一行代码删除

    SELECT 'TRUNCATE TABLE ' + d.NAME + ';' 
    FROM   sys.tables d 
    WHERE  type = 'U'