Sql-Server-2008-R2

使用前綴刪除表的腳本

  • May 13, 2020

我正在執行 SQL Serve 2008,我們有一些明顯用於測試的測試表。表的前綴是Test_,我的問題是,這個腳本會刪除我執行它的數據庫上所有前綴為Test_的表嗎?

declare @cmd varchar(4000)
declare cmds cursor for 
select 'drop table [' + Table_Name + ']'
from INFORMATION_SCHEMA.TABLES
where Table_Name like 'Test%'

open cmds
while 1=1
begin
 fetch cmds into @cmd
 if @@fetch_status != 0 break
 exec(@cmd)
end
close cmds;
deallocate cmds

這個腳本會刪除我執行它的數據庫上所有前綴為 Test_ 的表嗎?

是的,它將DROP表格。DELETE 通常用於刪除數據。您的腳本將物理刪除表。

另外,請不要使用INFORMATION_SCHEMA,也不需要游標。您的腳本可以使用動態 sql 輕鬆編寫。


**編輯:**在評論中,@MartinSmith指出了他的一個很好的答案- 我不知道……但在連接時讓人大開眼界。(老實說,我從來沒有遇到過,但現在會意識到問題!再次感謝馬丁!)

唯一保證的機制如下:

  • 使用游標以特定順序遍歷行並連接值
  • 用於帶有 ORDER BY 的 xml 查詢以生成連接值
  • 使用 CLR 聚合(這不適用於 ORDER BY 子句)
DECLARE @sql nvarchar(max) = N'';

SELECT @sql = (select N'drop table ' + QUOTENAME(t.name) + N';'
FROM sys.tables AS t
WHERE t.name LIKE N'Test_%'
order by object_id 
FOR XML PATH(''), TYPE
).value('.','nvarchar(max)')

print @sql ;
-- caution below will ACTUALLY drop the tables.
-- review the output and then uncomment below line
EXEC sys.sp_executesql @sql;

引用自:https://dba.stackexchange.com/questions/136765