Ich weiß, dass dies jetzt ein alter Beitrag ist, aber ich habe alle Antworten hier in einer Vielzahl von Datenbanken ausprobiert und festgestellt, dass sie alle manchmal, aber nicht immer für verschiedene (ich kann nur annehmen) Macken von SQL Server funktionieren.
Irgendwann habe ich mir das ausgedacht. Ich habe dies überall getestet (im Allgemeinen), was ich kann, und es funktioniert (ohne versteckte Speicherprozeduren).
Hinweis hauptsächlich auf SQL Server 2014. (aber die meisten anderen Versionen, die ich ausprobiert habe, scheinen auch gut zu funktionieren).
Ich habe versucht, während Schleifen und Nullen usw. usw., Cursor und verschiedene andere Formen, aber sie scheinen immer auf einigen Datenbanken zu scheitern, aber nicht auf anderen ohne offensichtlichen Grund.
Eine Zählung zu erhalten und diese zum Iterieren zu verwenden, scheint immer bei allem zu funktionieren, was ich getestet habe.
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