6

¿Cómo puedo realizar esta consulta en cualquier forma:¿Cómo eliminar todas las tablas de db? No se puede eliminar de sys.tables

delete from sys.tables where is_ms_shipped = 0 

Lo que pasa es, que ejecuta una consulta muy grande y se me olvidó poner USE Directiva en la parte superior de la misma, ahora tengo un trillón de tablas en mi master db, y no quiero borrarlas una a una.

ACTUALIZACIÓN: Es una base de datos completamente nueva, por lo que no tengo que preocuparme por ningún dato anterior, el resultado final que deseo lograr es restablecer el maestro de bases de datos al envío de fábrica.

+1

Los objetos 'sys. *' Son ** vistas del catálogo del sistema ** que le permiten consultar, pero no manipular, las vistas de los objetos en su base de datos. Para crear objetos DROP, use los comandos SQL apropiados. –

+0

Sí, me di cuenta de eso. Estaba buscando CUALQUIER forma de obtener mis cambios. – Shimmy

Respuesta

1

forma más simple y más corto que hice fue esto:

How to Rebuild System Databases in SQL Server 2008

El problema con todas las otras respuestas aquí es que no funciona, ya que hay r tablas eufóricas y se niega a ejecutar.

Éste, no solo funciona, sino que en realidad es lo que estoy buscando: "Restablecer los valores predeterminados de fábrica" ​​como se indica en la pregunta.
También este eliminará todo, no solo las tablas.

7

Si se trata de un problema de una sola vez, utilice SQL Server Management Studio para eliminar las tablas.

Si tiene que ejecutar un script muy, muy Uso cuidadosamente esto:

EXEC sp_msforeachtable 'DROP TABLE ?' 
+0

¿Puedes completar el resto? He actualizado mi respuesta. – Shimmy

+0

@Shimmy: Ver respuesta actualizada. Esto descarta todas las tablas de usuario en la base de datos, a menos que las claves externas se tengan que eliminar primero. Sin embargo, no elimina usuarios, sinónimos, etc. –

+0

Lea también la consulta en mi pregunta, no quiero eliminar TODAS las tablas, solo quiero eliminar tablas que agregué accidentalmente, no tablas que se han enviado con la instalación. – Shimmy

2

No hay copias de seguridad? :-)

Un enfoque puede ser crear un proyecto de base de datos en Visual Studio con una importación de base de datos inicial. A continuación, elimine las tablas y sincronice el proyecto de nuevo a la base de datos. Puede hacer las eliminaciones en masa con este enfoque mientras está "amortiguado" con una fase de compromiso y UI.

Soy bastante seguro de que el enfoque anterior se puede utilizar para hacerse cargo de las relaciones de la tabla también (aunque he intentado no en el espacio de "maestro"). También recomendaría usar un proyecto VS DB (u otra herramienta de administración de base de datos que permita la comparación y sincronización de esquemas) para facilitar la vida en el futuro y permitir el seguimiento de cambios de esquema con posibilidad de versión (por ejemplo, con SCM).

Ah, y lo que sea que se haga, primero cree una copia de seguridad. Si nada más, es un buen entrenamiento :-)

+0

Es una instalación de instancia totalmente nueva, no había nada para hacer una copia de seguridad ... – Shimmy

1

No es muy elegante, pero esta es una tarea única.

WHILE EXISTS(SELECT * FROM sys.tables where is_ms_shipped = 0) 
     EXEC sp_MSforeachtable 'DROP TABLE ?' 

funciona bien en esta sencilla prueba (borrado de a en el segundo bucle tras fracasar en el primer intento y proceder en adelante para eliminar b)

create table a 
(
a int primary key 
) 
go 

create table b 
(
a int references a (a) 
) 

insert into a values (1) 

insert into b values (1) 
3

Un método que he utilizado en el pasado es bastante simple y relativamente infalible es consultar las tablas del sistema/esquema de información (según los requisitos exactos) y hacer que muestre la lista de comandos que deseo ejecutar como resultado conjunto. Revise eso, copie & paste, ejecute - rápido & fácil para un trabajo de una sola vez y porque todavía está presionando manualmente el botón en el bit destructivo, es (IMHO) más difícil tirar cosas por error.

Por ejemplo:

select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0 
1

Este código podría ser mejor, pero yo estaba tratando de ser prudente, ya que lo escribí. Creo que es fácil de seguir y es fácil de ajustar para probar antes de comprometerse a eliminar sus tablas.

DECLARE 
    @Prefix VARCHAR(50), 
    @TableName NVARCHAR(255), 
    @SQLToFire NVARCHAR(350) 

SET @Prefix = 'upgrade_%' 

WHILE EXISTS(
    SELECT 
     name 
    FROM 
     sys.tables 
    WHERE 
     name like @Prefix 
    ) 
BEGIN 
    SELECT 
     TOP 1 --This query only iterates if you are dropping tables 
     @TableName = name 
    FROM 
     sys.tables 
    WHERE 
     name like @Prefix 

    SET @SQLToFire = 'DROP TABLE ' + @TableName 

    EXEC sp_executesql @SQLToFire; 
END 
1

hice algo muy similar y lo terminé haciendo fue el uso de las tareas -> base de datos de secuencia de comandos para la escritura solamente gotas para todos los objetos de la base de la base de datos previsto originalmente. Es decir, la base de datos en la que se suponía que debía ejecutar el script gigante, en el que lo ejecuté. Asegúrese de incluir IF Existe en las opciones avanzadas, luego ejecute esa secuencia de comandos contra el maestro y BAM, elimina todo lo que existe en la base de datos de destino original que también existe en el maestro, dejando las diferencias, que deberían ser los elementos maestros originales.

Cuestiones relacionadas