1つのクエリで共通のプレフィックスを持つ複数のテーブルを削除するにはどうすればよいですか?


17

Microsoft SQL Server 2008を使用していますが、1つのクエリで共通のプレフィックスを持つ複数のテーブルを削除するにはどうすればよいですか?

そのテーブル名のようなもの:

LG_001_01_STLINE, 
LG_001_02_STFICHE

回答:


32

カタログビューを使用して文字列を作成できます。例:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += '
DROP TABLE ' 
    + QUOTENAME(s.name)
    + '.' + QUOTENAME(t.name) + ';'
    FROM sys.tables AS t
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id] 
    WHERE t.name LIKE 'LG_001%';

PRINT @sql;
-- EXEC sp_executesql @sql;

もちろん、潜在的な落とし穴があります。たとえば、これらのテーブルに外部キー関係がある場合、まずそれらを削除するか、特定の順序でテーブルを削除するように出力を調整する必要があります。

テーブルのリストを取得するには、次を使用します。

SELECT s.name, t.name 
  FROM sys.tables AS t 
  INNER JOIN sys.schemas AS s 
  ON t.[schema_id] = s.[schema_id] 
  WHERE t.name LIKE 'LG_001%';

「特定の順序でテーブルをドロップするように出力を調整する」ことを覚えていただき、ありがとうございます!
sdlins

4

このクエリを実行し、結果をクエリウィンドウに貼り付けて、すべてのテーブルを削除しました。

SELECT 'DROP TABLE ' + NAME from sys.tables
ORDER BY NAME

すべてのテーブルを削除するが、A、B、C、またはDで始まる名前を持つテーブルを保持する場合:

SELECT 'DROP TABLE ' + NAME from sys.tables
WHERE NAME NOT LIKE '[ABCD]%'
GROUP BY NAME

-1

これにより、より多くのテーブルを削除できます。

declare 
@cursor as cursor, 
@FTABLE as varchar(500) 
set @cursor = CURSOR FOR 
select 'drop table ' + NAME + ';' 
from sys.tables 
where not SUBSTRING(NAME,10,3) in 
( 
'310', 
'311', 
'312', 
'313', 
'314', 
'320', 
'321', 
'322' 
) 
open @cursor 
fetch next from @cursor into @FTABLE 
while (@@FETCH_STATUS =0) 
begin 
        exec(@FTABLE) 
        print @FTABLE 
fetch next from @cursor into @FTABLE 
end 
close @cursor 
deallocate @cursor 

2
何より大きい?OPが要求するような、共通のプレフィックスを持つテーブルを検索するようにSQLを変更できますか?
-dezso

-1

私が書いたこのものが好きです:

  DECLARE @chv_LG001_TableName nvarchar (100)
  DECLARE @chv_DROP_LG001_Tables nvarchar(100)
  DECLARE @chv_LG001_Table_Count int

  SET @chv_LG001_Table_Count = (SELECT count(OBJECT_NAME(id))
        FROM SYSINDEXES
        WHERE OBJECTPROPERTY(id,'isUserTable')=1 AND indid < 2
            and OBJECT_NAME(id) like 'LG_001%')

 IF @chv_LG001_Table_Count > 0
    BEGIN

    DECLARE  Drop_LG001_Tables_Cursor CURSOR FOR
      -- This query will give you the table list you are wanting
        SELECT OBJECT_NAME(id)
        FROM SYSINDEXES
        WHERE OBJECTPROPERTY(id,'isUserTable')=1 AND indid < 2
            and OBJECT_NAME(id) like 'LG_001%'

    OPEN Drop_LG001_Tables_Cursor
    FETCH NEXT FROM Drop_LG001_Tables_Cursor INTO @chv_LG001_TableName 
    WHILE @@FETCH_STATUS = 0 

    BEGIN           

    SET @chv_DROP_LG001_Tables = 'DROP TABLE ' + '[' + @chv_LG001_TableName + ']'

    --Print @chv_DROP_LG001_Tables 
-- Uncomment the next line when you are ready because it WILL clear out these tables. 
    --EXEC sp_executesql @chv_DROP_LG001_Tables

    FETCH NEXT FROM Drop_LG001_Tables_Cursor
    INTO @chv_LG001_TableName

    END

    CLOSE Drop_LG001_Tables_Cursor
    DEALLOCATE Drop_LG001_Tables_Cursor

END

2
ここで非常に多くの問題。(1)カーソルの足場は複雑で不要です。(2)ファイアホースカーソルを使用する場合、少なくともSTATICandおよび/またはLOCAL FAST_FORWARD](sqlperformance.com/2012/09/t-sql-queries/cursor-options)を使用する必要があります。(3)のような、非推奨の後方互換性ビューを使用しないでくださいsysindexes。(4)スクリプトは、すべてのテーブルがdboスキーマ(または、さらに悪いことに、実行ユーザーのデフォルトスキーマであり、そうでさえない可能性があるdbo)にあることを前提としています。
アーロンバートランド

-2

これはexecute、次のように使用して実行できます。

declare @sql1 nvarchar(max) 
SELECT @sql1 =
 STUFF(
  (
    select ' drop table dbo.[' + name + ']'

FROM         sys.sysobjects AS sobjects
WHERE     (xtype = 'U') AND (name LIKE 'GROUP_BASE_NEW_WORK_%')
        for xml path('')
   ),
        1,1,'')

        execute sp_executesql @sql1

1
これは本質的にバリエーションですが、受け入れられた答えの改善はありません。違いは、1)デフォルトのスキーマがであると仮定しdbo2)名前に決してaを含めることはできないと仮定したこと]です。どちらもOPの場合には当てはまるかもしれませんが、それでも良いでしょうこれらの仮定に言及することをお勧めします。なぜなら、それらの仮定に続く警告は、他の人には完全に明白ではないかもしれないからです。それでも、冒頭で述べたように、この答えの私の主な問題は、新しい価値を追加することなく、既存の提案を再表示することです。
アンドリーM

-3
SELECT s.name, t.name 
  FROM sys.tables AS t 
  INNER JOIN sys.schemas AS s 
  ON t.[schema_id] = s.[schema_id] 
  WHERE t.name LIKE 'LG_001%';

上記のクエリを実行し、結果をcsvに保存します。次に、メモ帳でそのCSVを開きます。次に、Ctrl + Hを実行して、スキーマをDROP TABLE SCHEMAに置き換えます。これにより、すべてのドロップクエリが提供され、この大きなSQLをコピーしてSQLツールに貼り付けて実行します。

結果が

myschema.table1
myschema.table2

交換後、次のようになります

DROP TABLE MYSCHEMA.TABLE1
DROP TABLE MYSCHEMA.TABLE2

-1 Excelでコピー/貼り付けしてドロップコマンドを生成するのはなぜですか?PRINTステートメントを使用して簡単に実行できます。あなたの答えは最高の投票の答えよりもどうですか?
キンシャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.