ver una todas tablas tabla obtener listar las estructura datos crear como columnas buscar bases sql-server sql-server-2008 ssms sp-msforeachtable

sql-server - una - obtener estructura de tabla sql server



¿Cómo colocar todas las tablas en una base de datos de SQL Server? (13)

¿Qué hay de dejar caer toda la base de datos y luego crearla de nuevo? Esto funciona para mí

DROP DATABASE mydb; CREATE DATABASE mydb;

Estoy intentando escribir un script que vaciará por completo una base de datos de SQL Server. Esto es lo que tengo hasta ahora:

USE [dbname] GO EXEC sp_msforeachtable ''ALTER TABLE ? NOCHECK CONSTRAINT all'' EXEC sp_msforeachtable ''DELETE ?''

Cuando lo ejecuto en Management Studio, obtengo:

Comando (s) completado con éxito.

pero cuando actualizo la lista de la tabla, todos siguen allí. ¿Qué estoy haciendo mal?


Corto y dulce:

USE YOUR_DATABASE_NAME -- Disable all referential integrity constraints EXEC sp_MSforeachtable ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'' GO -- Drop all PKs and FKs declare @sql nvarchar(max) SELECT @sql = STUFF((SELECT ''; '' + ''ALTER TABLE '' + Table_Name +'' drop constraint '' + Constraint_Name from Information_Schema.CONSTRAINT_TABLE_USAGE ORDER BY Constraint_Name FOR XML PATH('''')),1,1,'''') EXECUTE (@sql) GO -- Drop all tables EXEC sp_MSforeachtable ''DROP TABLE ?'' GO


En SSMS:

  • Haga clic derecho en la base de datos
  • Ve a "Tareas"
  • Haga clic en "Generar guiones"
  • En la sección "Elegir objetos", seleccione "Script de toda la base de datos y todos los objetos de la base de datos"
  • En la sección "Establecer opciones de scripting", haz clic en el botón "Avanzado"
  • En "Script DROP and CREATE", cambie "Script CREATE" a "Script DROP" y presione OK
  • Luego, guarde en archivo, portapapeles o nueva ventana de consulta.
  • Ejecutar guión.

Ahora, esto eliminará todo, incluida la base de datos. Asegúrese de eliminar el código de los elementos que no quiere que caigan. Alternativamente, en la sección "Elegir objetos", en lugar de seleccionar guiar toda la base de datos simplemente seleccione los elementos que desea eliminar.


Estás casi en lo cierto, usa en su lugar:

EXEC sp_msforeachtable ''ALTER TABLE ? NOCHECK CONSTRAINT all'' EXEC sp_msforeachtable ''DROP TABLE ?''

pero en la segunda línea es posible que deba ejecutar más de una vez hasta que deje de obtener el error:

Could not drop object ''dbo.table'' because it is referenced by a FOREIGN KEY constraint.

Mensaje:

Command(s) completed successfully.

significa que todas las tablas se eliminaron con éxito.


La manera de ayunar es:

  1. Nuevos diagramas de base de datos
  2. Añadir toda la tabla
  3. Ctrl + A para seleccionar todo
  4. Haga clic derecho en "Eliminar de la base de datos"
  5. Ctrl + S para guardar
  6. Disfrutar

La respuesta aceptada no es compatible con Azure. Utiliza un procedimiento almacenado no documentado "sp_MSforeachtable". Si obtiene un error "azul no pudo encontrar el procedimiento almacenado ''sp_msforeachtable'' ''cuando se ejecuta o si simplemente desea evitar el uso de funciones no documentadas (que pueden eliminarse o cambiar su funcionalidad en cualquier punto), intente lo siguiente.

Esta versión ignora la tabla del historial de migración del marco de entidad "__MigrationHistory" y el "database_firewall_rules" que es una tabla de Azure que no tendrá permiso para eliminar.

Ligeramente probado en Azure. Verifique para que esto no tenga efectos no deseados en su entorno.

DECLARE @sql NVARCHAR(2000) WHILE(EXISTS(SELECT 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE=''FOREIGN KEY'')) BEGIN SELECT TOP 1 @sql=(''ALTER TABLE '' + TABLE_SCHEMA + ''.['' + TABLE_NAME + ''] DROP CONSTRAINT ['' + CONSTRAINT_NAME + '']'') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = ''FOREIGN KEY'' EXEC(@sql) PRINT @sql END WHILE(EXISTS(SELECT * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != ''__MigrationHistory'' AND TABLE_NAME != ''database_firewall_rules'')) BEGIN SELECT TOP 1 @sql=(''DROP TABLE '' + TABLE_SCHEMA + ''.['' + TABLE_NAME + '']'') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != ''__MigrationHistory'' AND TABLE_NAME != ''database_firewall_rules'' EXEC(@sql) PRINT @sql END

Tomado de:

https://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/

http://www.sqlservercentral.com/blogs/sqlservertips/2011/10/11/remove-all-foreign-keys/


Para mí, la forma más fácil:

--First delete all constraints DECLARE @sql NVARCHAR(MAX); SET @sql = N''''; SELECT @sql = @sql + N'' ALTER TABLE '' + QUOTENAME(s.name) + N''.'' + QUOTENAME(t.name) + N'' DROP CONSTRAINT '' + QUOTENAME(c.name) + '';'' FROM sys.objects AS c INNER JOIN sys.tables AS t ON c.parent_object_id = t.[object_id] INNER JOIN sys.schemas AS s ON t.[schema_id] = s.[schema_id] WHERE c.[type] IN (''D'',''C'',''F'',''PK'',''UQ'') ORDER BY c.[type]; EXEC sys.sp_executesql @sql; -- Then drop all tables exec sp_MSforeachtable ''DROP TABLE ?''


Parece que el comando debería ser sin la manta cuadrada

EXEC sp_msforeachtable ''drop table ?''


Sé que esta es una publicación anterior ahora, pero he intentado con todas las respuestas aquí en una multitud de bases de datos y he encontrado que todas funcionan a veces, pero no todo el tiempo, por varias peculiaridades (solo puedo suponer) de SQL Server.

Finalmente, se me ocurrió esto. He probado esto en todas partes (en general) puedo y funciona (sin ningún procedimiento de almacenamiento oculto).

Nota sobre todo en SQL Server 2014. (pero la mayoría de las otras versiones que probé también parece funcionar bien).

He intentado con loops y nulos, etc., cursores y otras formas, pero siempre parecen fallar en algunas bases de datos, pero no en otras, sin una razón obvia.

Obtener un conteo y usar eso para iterar siempre parece funcionar en todo lo que he probado.

USE [****YOUR_DATABASE****] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- Drop all referential integrity constraints -- -- Drop all Primary Key constraints. -- DECLARE @sql NVARCHAR(296) DECLARE @table_name VARCHAR(128) DECLARE @constraint_name VARCHAR(128) SET @constraint_name = '''' DECLARE @row_number INT SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1 LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME WHILE @row_number > 0 BEGIN BEGIN SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1 LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME AND rc1.CONSTRAINT_NAME > @constraint_name ORDER BY rc1.CONSTRAINT_NAME SELECT @sql = ''ALTER TABLE [dbo].['' + RTRIM(@table_name) +''] DROP CONSTRAINT ['' + RTRIM(@constraint_name)+'']'' EXEC (@sql) PRINT ''Dropped Constraint: '' + @constraint_name + '' on '' + @table_name SET @row_number = @row_number - 1 END END GO -- Drop all tables -- DECLARE @sql NVARCHAR(156) DECLARE @name VARCHAR(128) SET @name = '''' DECLARE @row_number INT SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = ''U'' AND category = 0 WHILE @row_number > 0 BEGIN SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = ''U'' AND category = 0 AND [name] > @name ORDER BY [name]) SELECT @sql = ''DROP TABLE [dbo].['' + RTRIM(@name) +'']'' EXEC (@sql) PRINT ''Dropped Table: '' + @name SET @row_number = @row_number - 1 END GO


También puede eliminar todas las tablas de la base de datos usando solo herramientas MSSMS (sin usar sql). A veces, de esta manera puede ser más cómodo (especialmente si se realiza ocasionalmente)

Lo hago paso a paso de la siguiente manera:

  1. Seleccione ''Tablas'' en el árbol de la base de datos (Explorador de objetos)
  2. Presione F7 para abrir la vista de detalles del Explorador de objetos
  3. En esta vista, seleccione tablas que deban eliminarse (en este caso, todas)
  4. Presione Borrar hasta que se eliminen todas las tablas (lo repite tantas veces como la cantidad de errores debido a restricciones / dependencias de clave)

Tampoco funciona para mí cuando hay varias tablas de claves externas.
Encontré ese código que funciona y hace todo lo que intenta (eliminar todas las tablas de su base de datos):

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR SET @Cursor = CURSOR FAST_FORWARD FOR SELECT DISTINCT sql = ''ALTER TABLE ['' + tc2.TABLE_NAME + ''] DROP ['' + rc1.CONSTRAINT_NAME + '']'' FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1 LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql WHILE (@@FETCH_STATUS = 0) BEGIN Exec sp_executesql @Sql FETCH NEXT FROM @Cursor INTO @Sql END CLOSE @Cursor DEALLOCATE @Cursor GO EXEC sp_MSforeachtable ''DROP TABLE ?'' GO

Puedes encontrar la publicación here . Es la publicación de Groker.


delete se utiliza para eliminar filas de una tabla. Deberías usar drop table lugar.

EXEC sp_msforeachtable ''drop table [?]''


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