2016-05-25 11 views
1

私はdbテーブルの束を持っています。私のスクリプトは次のとおりです....しかし、私は私の試行を実行すると無限ループを作成しました..1以外のすべてのテーブルを削除する方法

どのように私はこれを行うことができますか?

/* 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 
IF @name != 'tableNotToBeDropped' 
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 

答えて

6

ループはまったく必要ありません。

DECLARE @tables NVARCHAR(MAX) = 
     STUFF((SELECT ',' + QUOTENAME([table_name]) AS [text()] 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE table_schema = 'dbo' 
       AND TABLE_NAME <> 'tableNotToBeDropped' 
       FOR XML PATH('')),1,1,''); 

DECLARE @sql NVARCHAR(MAX) = 'DROP TABLE ' + @tables; 

-- debug 
SELECT @sql; 

EXEC sp_executesql @sql; 

LiveDemo

仕組み::DROP TABLE 1つのステートメントで複数のテーブルをドロップすることができ

  1. は1
  2. 除いて、特定のスキーマから全てのテーブル名を取得カンマ区切りを作成します。リスト
  3. ドロップテーブル

テーブルに外部キーが定義されている場合は、削除の順序が重要であることに注意してください。

-1

代わりにカーソルを使用して、カーソルクエリのwhere句と同じでない名前を追加することをお勧めします。

http://www.kodyaz.com/articles/sql-cursor-example-tables-rows-count-using-sql-server-cursor.aspx

+1

。 –

+0

彼はループをしようとしていました。私は1つである必要はないと知っていますが、一部の人はxml systaxの方が好きではありません。 –

+0

ループを使用せずに他の方法で行うこともできます。ほとんどの人はループなしでこのようなことをする方法を知らず、いつも新しいテクニックを学ぶことに興奮しています。 –

1

この1つのライナーも動作します。このような何かにループのあらゆる種類の必要はありません

sp_MSforeachtable @command1='IF OBJECT_ID(''?'') NOT IN (OBJECT_ID(''TableToNotDelete'')) DROP TABLE ?' 
+1

これは、カーソルを使用するもう一つの方法です。ここでループする必要はありません。そして、これは文書化されていません。 ;) –

関連する問題