2012-01-19 18 views

答えて

75

これはあなたのためのすべてのDROP TABLE文を生成し、SQL文を出力します。 これで、コピーして実行する前に期待することを検証できます。ただ、多分:)最初に私が知っている

DECLARE @SqlStatement NVARCHAR(MAX) 
SELECT @SqlStatement = 
    COALESCE(@SqlStatement, N'') + N'DROP TABLE [DBO1].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'DBO1' and TABLE_TYPE = 'BASE TABLE' 

PRINT @SqlStatement 
+6

そして、彼らは本当に** **一度にそれをやってみたかった場合、彼らは、exec(またはEXEC sp_executesqlを)可能性が最後に@SqlStatement。 – DaveShaw

+0

は、データベースに制約がある場合には機能しません。 – ladieu

+0

@ladieu - あなたは何を言っていますか?それはあなたが制約を持っている場合は動作します... – AdaTheDev

25

やや古いスレッドをバックアップを取るが、私はこのような何かを探していると、元の答えは非常に役に立ったた...あなたは100%確信していることを確認してください。つまり、スクリプトはDROP TABLE文を発行してビューを削除しようとするため、そのスキーマに存在する可能性のあるビューを削除してエラーメッセージを表示しようとします。

これは、与えられたスキーマからすべてのテーブル、ビュー、プロシージャ、および関数を削除する必要があったため、これを書き留めました。これを達成する最もエレガントな方法ではないかもしれませんが、それは私のために働いて、私は分かち合うと思っていました。

DECLARE @Sql VARCHAR(MAX) 
     , @Schema varchar(20) 

SET @Schema = 'Integration' --put your schema name between these quotes 

--tables 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP TABLE %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema 
    AND TABLE_TYPE = 'BASE TABLE' 
ORDER BY TABLE_NAME 


--views 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP VIEW %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema 
    AND TABLE_TYPE = 'VIEW' 
ORDER BY TABLE_NAME 

--Procedures 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP PROCEDURE %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema 
    AND ROUTINE_TYPE = 'PROCEDURE' 
ORDER BY ROUTINE_NAME 

--Functions 
SELECT @Sql = COALESCE(@Sql,'') + 'DROP FUNCTION %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema 
    AND ROUTINE_TYPE = 'FUNCTION' 
ORDER BY ROUTINE_NAME 


SELECT @Sql = COALESCE(REPLACE(@Sql,'%SCHEMA%',@Schema), '') 

PRINT @Sql 
12

@ Kevoの回答に基づいて、テーブルを削除する前に、すべての外部キー制約を削除するために、以下を追加しました。私はまたKevoの答え@上の建物SQL2008 R2に

select @Sql = COALESCE(@Sql,'') + 'ALTER TABLE %SCHEMA%.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) 
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
where s.name = @Schema 
ORDER BY t.name; 
7

をテストしてみた、私は私がTSQLのPrintステートメントを持っていた問題のためにループしながら、以下を追加しました。メッセージ文字列の長さは最大8,000文字です。 8,000を超えると、printステートメントは残りの文字を切り捨てます。

DECLARE @SqlLength int 
     , @SqlPosition int = 1 
     , @printMaxLength int = 8000 

SET @SqlLength = LEN(@Sql) 

WHILE (@SqlLength) > @printMaxLength 
BEGIN 
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength) 
    SET @SqlLength = @SqlLength - @printMaxLength 
    SET @SqlPosition = @SqlPosition + @printMaxLength 
END 
IF (@SqlLength) < @printMaxLength AND (@SqlLength) > 0 
BEGIN 
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength) 
END 
1

@ raider33と@Kevoの回答を1つのソリューションにまとめて直接実行しました。他の回答に

DECLARE @SqlStatement NVARCHAR(MAX) 
DECLARE @schema varchar(30) = 'SCHEMA_NAME'; 

select @SqlStatement = COALESCE(@SqlStatement,'') + 'ALTER TABLE '[email protected]+'.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) + CHAR(10) 
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
where s.name = @schema 
ORDER BY t.name; 

SELECT @SqlStatement += 
    COALESCE(@SqlStatement, '') + 'DROP TABLE ' + @schema +'.'+ QUOTENAME(TABLE_NAME) + ';' + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @schema 

EXECUTE sp_executesql @SqlStatement 
9

ビルは、ここでは、スキーマとスキーマ自体内のすべてのオブジェクトをドロップし、ストアドプロシージャspDropSchemaです。

プロシージャもシーケンスオブジェクトを削除しようとするため、SQL Server 2012以上でのみ動作することに注意してください。

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'spDropSchema') 
    BEGIN 
     DROP PROCEDURE spDropSchema 
    END 
GO 

CREATE PROCEDURE spDropSchema(@Schema nvarchar(200)) 
AS 

DECLARE @Sql NVARCHAR(MAX) = ''; 

--constraints 
SELECT @Sql = @Sql + 'ALTER TABLE '+ QUOTENAME(@Schema) + '.' + QUOTENAME(t.name) + ' DROP CONSTRAINT ' + QUOTENAME(f.name) + ';' + CHAR(13) 
FROM sys.tables t 
    inner join sys.foreign_keys f on f.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id 
WHERE s.name = @Schema 
ORDER BY t.name; 

--tables 
SELECT @Sql = @Sql + 'DROP TABLE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'BASE TABLE' 
ORDER BY TABLE_NAME 

--views 
SELECT @Sql = @Sql + 'DROP VIEW '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'VIEW' 
ORDER BY TABLE_NAME 

--procedures 
SELECT @Sql = @Sql + 'DROP PROCEDURE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'PROCEDURE' 
ORDER BY ROUTINE_NAME 

--functions 
SELECT @Sql = @Sql + 'DROP FUNCTION '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'FUNCTION' 
ORDER BY ROUTINE_NAME 

--sequences 
SELECT @Sql = @Sql + 'DROP SEQUENCE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(SEQUENCE_NAME) + ';' + CHAR(13) 
FROM INFORMATION_SCHEMA.SEQUENCES 
WHERE SEQUENCE_SCHEMA = @Schema 
ORDER BY SEQUENCE_NAME 

SELECT @Sql = @Sql + 'DROP SCHEMA '+ QUOTENAME(@Schema) + ';' + CHAR(13) 

EXECUTE sp_executesql @Sql 

GO 
+0

素敵な答え!!! –

+0

ベストアンサー!ありがとう! –

+1

時には、ユーザー定義型も削除する必要があります。それらは 'SELECT * FROM sys.types where is_user_defined = 1'で見つけることができます –

0

chris LB's answer上に構築私は私のクエリで重複した制約の削除を見たので、私は

GROUP BY d.constraint_object_id, t.name 

を追加しました。念のためにhttps://msdn.microsoft.com/en-us/library/ms186306.aspx

DECLARE @SqlStatement NVARCHAR(MAX), 
     @Schema NVARCHAR(20) 

SET @Schema = 'aa' 

SELECT @SqlStatement = 
    COALESCE(@SqlStatement,'') + 'ALTER TABLE '[email protected]+'.' + t.name + ' DROP CONSTRAINT ' + 
    OBJECT_NAME(d.constraint_object_id) + ';' + CHAR(13) + CHAR(10) 
FROM sys.tables t 
    JOIN sys.foreign_key_columns d on t.object_id = d.parent_object_id 
    INNER JOIN sys.schemas s on t.schema_id = s.schema_id 
WHERE s.name = @Schema 
GROUP BY d.constraint_object_id, t.name 
ORDER BY t.name; 
0

で述べたようにconstraint_object_idは、私はそれが便利な任意のデシベル/スキーマに使用することができるように、マスター・データベースにストアド・プロシージャとしてこれを追加し、それが誰かを助け、FK制約IDです。

それはこのように呼び出すことができます。

EXEC master.dbo.dropTablesInSchema 'my_db', 'dbo 

ストアドプロシージャのスクリプトを作成します。

CREATE PROC [master].[dbo].[dropTablesInSchema] 
    @db nvarchar(max), 
    @schema nvarchar(max) 
AS 
BEGIN 
    DECLARE @Tables TABLE (name nvarchar(max)) 
    INSERT INTO @Tables 
    EXEC ('SELECT TABLE_NAME FROM [' + @db + '].INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''' + @schema + ''' and TABLE_TYPE =''BASE TABLE''') 

    DECLARE @SqlStatement NVARCHAR(MAX) 
    SELECT @SqlStatement = 
     COALESCE(@SqlStatement, N'') + N'DROP TABLE [' + @db + '].[' + @schema + '].' + QUOTENAME(NAME) + N';' + CHAR(13) 
    FROM @Tables 

    EXEC(@SqlStatement) 

END 
0

これは、すべてのDROP TABLEを生成し、存在チェックでビューを削除します。

DECLARE @SqlStatement NVARCHAR(MAX) 

SELECT @SqlStatement = 
COALESCE(@SqlStatement, N'') + N'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'''+'['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) +''')' + CHAR(13)+ 
' DROP '+ TABLE_TYPE +' ['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA in ('SCHEMA1','SCHEMA2','SCHEMA13') 
ORDER BY TABLE_SCHEMA 

PRINT REPLACE(@SqlStatement,'DROP BASE TABLE ','DROP TABLE ') 
GO 
0
select 'DROP TABLE [TABSCHEMA].' + QUOTENAME(TABLE_NAME) + N';' from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TABSCHEMA' and TABLE_TYPE = 'BASE TABLE' 
関連する問題