回答:
カタログビューを使用して文字列を作成できます。例:
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%';
これにより、より多くのテーブルを削除できます。
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
私が書いたこのものが好きです:
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
STATIC
andおよび/またはLOCAL FAST_FORWARD
](sqlperformance.com/2012/09/t-sql-queries/cursor-options)を使用する必要があります。(3)のような、非推奨の後方互換性ビューを使用しないでくださいsysindexes
。(4)スクリプトは、すべてのテーブルがdbo
スキーマ(または、さらに悪いことに、実行ユーザーのデフォルトスキーマであり、そうでさえない可能性があるdbo
)にあることを前提としています。
これは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
dbo
、2)名前に決してaを含めることはできないと仮定したこと]
です。どちらもOPの場合には当てはまるかもしれませんが、それでも良いでしょうこれらの仮定に言及することをお勧めします。なぜなら、それらの仮定に続く警告は、他の人には完全に明白ではないかもしれないからです。それでも、冒頭で述べたように、この答えの私の主な問題は、新しい価値を追加することなく、既存の提案を再表示することです。
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
PRINT
ステートメントを使用して簡単に実行できます。あなたの答えは最高の投票の答えよりもどうですか?