Bagaimana cara menjatuhkan beberapa tabel dengan awalan umum dalam satu permintaan?


17

Saya menggunakan Microsoft SQL Server 2008. Pertanyaan saya adalah: Bagaimana cara menjatuhkan beberapa tabel dengan awalan umum dalam satu permintaan?

sesuatu seperti itu nama tabel:

LG_001_01_STLINE, 
LG_001_02_STFICHE

Jawaban:


32

Anda dapat membangun string menggunakan tampilan katalog, misalnya:

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;

Tentu saja ada Gotcha potensial, misalnya jika tabel ini memiliki hubungan kunci asing, Anda harus menjatuhkannya terlebih dahulu, atau mengatur output untuk menjatuhkan tabel dalam urutan tertentu.

Untuk mendapatkan daftar tabel, gunakan:

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

Terima kasih banyak untuk mengingat tentang "mengatur output untuk menjatuhkan tabel dalam urutan tertentu"!
sdlins

4

Saya menjalankan kueri ini lalu menempelkan hasilnya kembali ke jendela kueri untuk menjatuhkan semua tabel:

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

Jika Anda ingin menghapus semua tabel tetapi tetap dengan nama-nama yang dimulai dengan A, B, C atau D:

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

-1

Ini memungkinkan Anda untuk menghapus sejumlah besar tabel.

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
Lebih besar dari apa? Bisakah Anda memodifikasi SQL Anda sehingga mencari tabel dengan awalan umum, seperti yang diminta OP?
dezso

-1

Saya suka yang ini yang saya tulis:

  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
Banyak sekali masalah di sini. (1) Perancah kursor rumit dan tidak perlu. (2) Ketika Anda menggunakan kursor firehose, Anda setidaknya harus menggunakan STATICdan / atau LOCAL FAST_FORWARD] ( sqlperformance.com/2012/09/t-sql-queries/cursor-options ). (3) Anda tidak seharusnya menggunakan tampilan kompatibilitas mundur yang sudah usang sysindexes. (4) Skrip Anda menganggap semua tabel ada dalam dboskema (atau lebih buruk, skema default dari pengguna yang mengeksekusi, yang bahkan mungkin tidak dbo).
Aaron Bertrand

-2

Ini dapat dilakukan dengan menggunakan executesebagai berikut:

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
Ini pada dasarnya adalah variasi, tetapi tanpa perbaikan, pada jawaban yang diterima. Perbedaannya hanyalah bahwa Anda telah memilih untuk mengasumsikan bahwa 1) skema default seharusnya dbo, dan 2) nama tidak dapat mengandung ]- keduanya mungkin benar dalam kasus OP tetapi itu masih akan bagus Gagasan untuk menyebutkan asumsi-asumsi itu, karena peringatan yang mengikutinya mungkin tidak sepenuhnya jelas bagi orang lain. Namun, seperti yang saya katakan di awal, masalah utama saya dengan jawaban ini adalah hanya menyatakan kembali saran yang sudah ada tanpa menambahkan nilai baru.
Andriy 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%';

Jalankan kueri di atas dan simpan hasilnya ke csv. Kemudian buka CSV itu di notepad. Kemudian lakukan Ctrl + H untuk mengganti skema dengan DROP TABLE SCHEMA yang akan memberi Anda semua drop query, salin dan tempel sql besar ini ke dalam alat sql Anda dan jalankan

jika hasilnya Anda

myschema.table1
myschema.table2

setelah ganti, akan terlihat seperti ini

DROP TABLE MYSCHEMA.TABLE1
DROP TABLE MYSCHEMA.TABLE2

-1 Mengapa Anda melakukan copy / paste di Excel dan menghasilkan perintah drop? Anda dapat dengan mudah melakukannya menggunakan PRINTpernyataan. Bagaimana jawaban Anda lebih baik daripada jawaban dengan pilihan tertinggi?
Kin Shah
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.