2010-09-10 16 views

Respuesta

132

La solución de SQLMenace funcionó para mí con un ligero ajuste de cómo se borran los datos - DELETE FROM en lugar de 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 
+0

Me ... Pude borrar, pero no truncar. – Marcel

+11

También podría tener sentido hacer un 'EXEC sp_MSForEachTable' DBCC CHECKIDENT (''? '', RESEED, 0) ''después de DELETE FROM para restablecer todas las columnas de identidad a 0. –

+0

Siempre es un buen comienzo para el ¡día cuando encuentras 6 líneas de código que reemplazan 100s de instrucciones de eliminación! Este método funciona sin problemas en SQL 2014 Express. – Tommy

35

Por lo general sólo se utilizan el sp_MSForEachTable indocumentado proc

-- 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 

Ver también: Delete all data in database (when you have FKs)

+1

No creo que esto funcione. Parece que Kalen Delaney fue inadvertidamente responsable de comenzar esta idea. [Aquí lo aclara] (http://www.eggheadcafe.com/software/aspnet/29927698/cant-truncate-table.aspx) "debe eliminar la restricción de referencia para truncar la tabla". –

+0

Martin Lo acabo de ejecutar hace 2 segundos en Adventureworks DB sin ningún problema – SQLMenace

+0

Definitivamente no funciona para mí aquí. 'crear pruebas de base de datos; IR prueba de uso; crear tabla t1 (i int clave primaria) crear tabla t2 (i int clave principal, p int referencias t1) ' –

5

Por lo general, es mucho más rápido que la escritura a cabo todos los objetos en la base de datos, y crear un vacío, que para eliminar o truncar tablas

10
/* 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 
+0

esto realmente funcionó para mí –

12

Soy consciente de que es tarde, pero estoy de acuerdo con la sugerencia de AlexKuznetsov a la escritura de la base de datos, en lugar de pasar por la molestia de purgar los datos de las tablas. Si la solución TRUNCATE no funciona, y tiene una gran cantidad de datos, emitir (registrar) DELETE puede llevar mucho tiempo y se le dejarán identificadores que no se han vuelto a sembrar (es decir, una declaración INSERT en una tabla con una columna IDENTITY obtendría una ID de 50000 en lugar de una ID de 1).

Para la escritura de una base de datos completa, en SSMS, haga clic en la base de datos, a continuación, seleccione TASKS ->Generate scripts:

enter image description here

Haga clic Next para omitir la pantalla de bienvenida Asistente para, a continuación, seleccione el que los objetos querer guión:

enter image description here

En la pantalla Set scripting options, usted puede escoger la configuración de las secuencias de comandos, como si para generar 1 guión de todos los objetos, o secuencias de comandos separados para los objetos individuales, y si hay que guardar el archivo en Unicode o ANSI:

enter image description here

El asistente mostrará un resumen, que se puede utilizar para verificar que todo sea como se desee, y cerrar haciendo clic en 'Finalizar'.

3

A continuación una secuencia de comandos que utiliza para eliminar todos los datos de una base de datos 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 
-- .... 
-- .... 
-- .... 
4
  1. En primer lugar tendrá que desactivar todos los disparadores:

    sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'; 
    
  2. Ejecutar este secuencia de comandos: (Tomado de este post Gracias @SQLMenace)

    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 
    

Este script generará las declaraciones DELETE en el orden correcto.a partir de tablas de referencia queridos a continuación hacen referencia a

  1. Copiar las declaraciones DELETE FROM y ejecutarlos una vez

  2. activar disparadores

    sp_msforeachtable 'ALTER TABLE ? ENABLE TRIGGER all' 
    
  3. confirmar los cambios:

    begin transaction 
    commit; 
    
+0

Esto no funciona para mí, la consulta recursiva termina en un bucle. Tal vez por auto reverenses. –

0
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 
Cuestiones relacionadas