Frage

Ich verwende Microsoft SQL Server 2008.My -Frage lautet: Wie löschen Sie mehrere Tabellen mit einem gemeinsamen Präfix in einer Abfrage?

So etwas wie diese Tabellennamen:

LG_001_01_STLINE, 
LG_001_02_STFICHE
War es hilfreich?

Lösung

Sie können eine Zeichenfolge mit den Katalogansichten aufbauen, z. B.:

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;

Natürlich gibt es potenzielle Gotchas, beispielsweise wenn diese Tabellen fremde Schlüsselbeziehungen haben, müssen Sie sie entweder zuerst fallen lassen oder die Ausgabe anordnen, um die Tabellen in einer bestimmten Reihenfolge zu fallen.

Verwenden Sie: Um nur die Tabellenliste zu erhalten, verwenden Sie:

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%';

Andere Tipps

Ich habe diese Abfrage ausgeführt und die Ergebnisse wieder in das Abfragebergen eingefügt, um alle Tabellen fallen zu lassen:

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

Wenn Sie alle Tabellen löschen möchten, aber diejenigen mit Namen halten möchten, die mit A, B, C oder D begonnen haben:

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

Auf diese Weise können Sie eine viel größere Anzahl von Tabellen löschen.

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 

Ich mag diesen, den ich geschrieben habe:

  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

Dies kann verwendet werden execute folgendermaßen:

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
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%';

Überfragen Sie die Abfrage und speichern Sie die Ergebnisse in einem CSV. Dann öffnen Sie diesen CSV in einem Notizblock. Machen Sie dann Strg+H, um das Schema durch Drop -Tabellen -Schema zu ersetzen, mit dem Sie alle Drop -Abfragen erhalten, kopieren und fügen Sie diesen großen SQL in Ihr SQL -Tool ein und führen Sie aus

Wenn Ihre Ergebnisse sind

myschema.table1
myschema.table2

Nach dem Ersetzen wird es so aussehen

DROP TABLE MYSCHEMA.TABLE1
DROP TABLE MYSCHEMA.TABLE2
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top