J'essaie d'écrire un script qui videra complètement une base de données SQL Server. C'est ce que j'ai jusqu'ici:
USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'
Lorsque je l'exécute dans Management Studio, je reçois:
Commande (s) terminée (s) avec succès.
mais quand je rafraîchit la liste des tables, ils sont tous encore là. Qu'est-ce que je fais mal?
Cela ne fonctionne pas non plus pour moi lorsqu'il existe plusieurs tables de clés étrangères.
J'ai trouvé ce code qui fonctionne et fait tout ce que vous essayez (supprimez toutes les tables de votre base de données):
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
Vous pouvez trouver le message ici . C'est le message de Groker.
Vous pouvez également supprimer toutes les tables de la base de données en utilisant uniquement les outils MSSMS (sans utiliser SQL). Parfois, cette façon peut être plus confortable (surtout si elle est exécutée occasionnellement)
Je fais cela étape par étape comme suit:
delete
est utilisé pour supprimer des lignes d'une table. Vous devriez utiliser drop table
à la place.
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
Vous avez presque raison, utilisez plutôt:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'
mais la deuxième ligne vous devrez peut-être exécuter plus d'une fois jusqu'à ce que vous n'ayez plus d'erreur:
Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.
Message:
Command(s) completed successfully.
signifie que toutes les tables ont été supprimées avec succès.
Dans SSMS:
Maintenant, cela supprimera tout, y compris la base de données. Assurez-vous de supprimer le code des éléments que vous ne voulez pas supprimer. Sinon, dans la section "Choisir des objets", au lieu de sélectionner la totalité de la base de données, sélectionnez simplement les éléments à supprimer.
Court et doux:
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
La réponse acceptée ne prend pas en charge Azure. Il utilise une procédure stockée non documentée "sp_MSforeachtable". Si vous obtenez une erreur «Azure n'a pas pu trouver la procédure stockée 'sp_msforeachtable» lors de son exécution ou souhaitez simplement éviter de vous fier à des fonctionnalités non documentées (pouvant être supprimées ou modifiées à tout moment), essayez ce qui suit.
Cette version ignore la table d'historique de migration du cadre d'entité "__MigrationHistory" et "database_firewall_rules", qui est une table Azure que vous ne serez pas autorisé à supprimer.
Légèrement testé sur Azure. Vérifiez que cela n’a pas d’effets indésirables sur votre environnement.
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
Pris à partir 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/
Semble la commande devrait être sans la couverture carrée
EXEC sp_msforeachtable 'drop table ?'
La voie à jeun est:
Pourquoi ne pas supprimer la base de données entière et la créer à nouveau? Cela fonctionne pour moi.
DROP DATABASE mydb;
CREATE DATABASE mydb;
Pour moi, le moyen le plus simple:
--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 ?'
Je sais que c’est un vieux message maintenant, mais j’ai essayé toutes les réponses ici sur une multitude de bases de données et j’ai trouvé qu’elles fonctionnaient toutes parfois, mais pas toujours, pour diverses (je ne peux que supposer) des bizarreries de SQL Server.
Finalement, je suis venu avec cela. J'ai testé cela partout (en général), je peux et cela fonctionne (sans procédure de magasin caché).
À noter principalement sur SQL Server 2014. (mais la plupart des autres versions que j'ai essayées semblent également fonctionner correctement).
J'ai essayé des boucles While, des valeurs nulles, etc., des curseurs et diverses autres formes, mais elles semblent toujours échouer sur certaines bases de données, mais pas les autres, sans raison évidente.
Obtenir un compte et utiliser cela pour itérer semble toujours fonctionner sur tout ce que j'ai testé.
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
Si vous voulez supprimer toutes les tables, vous pouvez également supprimer la base de données, puis en créer une nouvelle.
T-SQL:
DROP DATABASE Northwind
ALLER
CREATE DATABASE Northwind
ALLER
Pour cela dans SQL Management Studio (SSMS, dans mon cas, version 17.9.1):
Et tu as fini! Vous avez une nouvelle base de données sans aucune table. L'avantage de cette approche est que vous n'avez pas à vous soucier de contraintes, interdisant de supprimer des tables, des vues dépendantes ou des SP ne fonctionnant plus et n'ayant pas besoin de scripts SQL dynamiques. Vous pouvez les rajouter plus tard, à condition que vous ayez pris une sauvegarde, afin
Rappelez-vous pour sauvegarder votre base de données avant, faites-le! Si vous avez juste besoin de SP ou de vues, enregistrez-les en tant que script avant de recréer la base de données, modifiez-les pour qu'ils fonctionnent avec les nouvelles tables et les ajoutent ultérieurement.