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
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:
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%';
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
Đ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
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
STATIC
và / 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 dbo
lượ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
).
Điều này có thể được thực hiện bằng cách sử dụng execute
như 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
dbo
và 2) 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.
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
PRINT
tuyê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?