Làm cách nào để thả nhiều bảng có tiền tố chung trong một truy vấn?


17

Tôi đang sử dụng Microsoft SQL Server 2008. Câu hỏi của tôi là: Làm thế nào để bỏ nhiều bảng có tiền tố chung trong một truy vấn?

một cái gì đó giống như tên bảng:

LG_001_01_STLINE, 
LG_001_02_STFICHE

Câu trả lời:


32

Bạn có thể xây dựng một chuỗi bằng cách sử dụng các khung nhìn danh mục, ví dụ:

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;

Tất nhiên, có những vấn đề tiềm năng, ví dụ nếu các bảng này có mối quan hệ khóa ngoài, bạn sẽ cần phải thả chúng trước hoặc sắp xếp đầu ra để thả các bảng theo thứ tự nhất định.

Để chỉ lấy danh sách các bảng, sử dụng:

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

Cảm ơn bạn rất nhiều vì đã nhớ về "sắp xếp đầu ra để thả các bảng theo một thứ tự nhất định"!
sdlins

4

Tôi đã chạy truy vấn này sau đó dán kết quả vào cửa sổ truy vấn để thả tất cả các bảng:

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

Nếu bạn muốn xóa tất cả các bảng nhưng giữ những bảng có tên bắt đầu bằng A, B, C hoặc D:

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

-1

Điều này cho phép bạn xóa số lượng bảng lớn hơn nhiều.

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
Lớn hơn cái gì? Bạn có thể sửa đổi SQL của mình để nó tìm các bảng có tiền tố chung, như OP yêu cầu không?
dezso

-1

Tôi thích cái này mà tôi đã viết:

  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
Rất nhiều vấn đề ở đây. (1) Giàn giáo con trỏ rất phức tạp và không cần thiết. (2) Khi bạn sử dụng con trỏ firehose, ít nhất bạn nên sử dụng STATICvà / hoặc LOCAL FAST_FORWARD] ( sqlperformance.com/2012/09/t-sql-queries/coder-options ). (3) Bạn không nên sử dụng các chế độ xem tương thích ngược, không thích sysindexes. (4) Tập lệnh của bạn giả định tất cả các bảng nằm trong dbolược đồ (hoặc tệ hơn là lược đồ mặc định của người dùng thực thi, thậm chí có thể không dbo).
Aaron Bertrand

-2

Điều này có thể được thực hiện bằng cách sử dụng executenhư sau:

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
Đây thực chất là một biến thể, nhưng không có bất kỳ cải tiến nào, trên câu trả lời được chấp nhận. Sự khác biệt chỉ là bạn đã chọn giả định rằng 1) lược đồ mặc định được cho là dbo2) các tên không bao giờ có thể chứa một ]- cả hai đều có thể đúng trong trường hợp của OP nhưng nó vẫn tốt ý tưởng đề cập đến những giả định đó, bởi vì những lời cảnh báo tiếp theo từ chúng có thể không hoàn toàn rõ ràng đối với người khác. Tuy nhiên, như tôi đã nói lúc đầu, vấn đề chính của tôi với câu trả lời này là nó chỉ khôi phục một đề xuất đã có mà không thêm bất kỳ giá trị mới nào.
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%';

Chạy truy vấn trên và lưu kết quả vào một csv. Sau đó mở CSV đó trong một notepad. Sau đó, thực hiện Ctrl + H để thay thế lược đồ bằng DROP TABLE SCHema sẽ cung cấp cho bạn tất cả các truy vấn thả, sao chép và dán sql lớn này vào công cụ sql của bạn và thực hiện

nếu kết quả của bạn là

myschema.table1
myschema.table2

sau khi thay thế, nó sẽ trông như thế này

DROP TABLE MYSCHEMA.TABLE1
DROP TABLE MYSCHEMA.TABLE2

-1 Tại sao bạn lại sao chép / dán trong Excel và tạo lệnh thả? Bạn có thể dễ dàng làm điều đó bằng cách sử dụng PRINTtuyên bố. Làm thế nào là câu trả lời của bạn tốt hơn câu trả lời được bình chọn cao nhất?
Kin Shah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.