如何实现批量删除相似表名中的数据

crazy_boom 2013-07-24 11:40:38
例如数据库中存在tmp_1001 tmp_1002 tmp_1003 ..... tmp_1203
等名字的表

如何实现将所有表名为”tmp_“ 开头的表 中的数据都删除


--得到所有的表名
declare @sql varchar(8000)
select 'DELETE FROM ' + NAME FROM SYSOBJECTS WHERE XTYPE='U' AND NAME LIKE 'TMP_%'
--这样可以一下得出所有要删除的语句 如何执行啊 准备做成JOB 自动来删除


...全文
510 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazy_boom 2013-08-04
  • 打赏
  • 举报
回复
引用 11 楼 htl258 的回复:
用delete的方式
exec sp_MSforeachtable 'Delete from ? where  object_name(object_id(''?'')) like ''%tmp[_]%'''

用truncate的方式
exec sp_MSforeachtable 'if object_name(object_id(''?'')) like ''%tmp[_]%'' truncate table ?'

这是什么功夫 !!! 好使!
kunshan 2013-07-27
  • 打赏
  • 举报
回复
引用 11 楼 htl258 的回复:
用delete的方式
exec sp_MSforeachtable 'Delete from ? where  object_name(object_id(''?'')) like ''%tmp[_]%'''

用truncate的方式
exec sp_MSforeachtable 'if object_name(object_id(''?'')) like ''%tmp[_]%'' truncate table ?'

这个也可以
htl258_Tony 2013-07-27
  • 打赏
  • 举报
回复
用delete的方式
exec sp_MSforeachtable 'Delete from ? where object_name(object_id(''?'')) like ''%tmp[_]%'''

用truncate的方式
exec sp_MSforeachtable 'if object_name(object_id(''?'')) like ''%tmp[_]%'' truncate table ?'

wangchangming 2013-07-26
  • 打赏
  • 举报
回复
引用 8 楼 crazy_boom 的回复:
数据库里的tmp_1001 这样的表有300多个 如果是SQL2005 使用 [quote=引用 5 楼 wangchangming 的回复:] DECLARE @sql VARCHAR(MAX) = '' SELECT @sql = @sql + 'DELETE FROM ' + NAME + CHAR(10) FROM SYS.TABLES WHERE CHARINDEX('tmp',NAME) > 0 PRINT @sql EXEC(@sql)
的方法就没有问题 但是 sql2000 的话 使用 declare @sql varchar(8000) 有这样的情况

DELETE FROM tmp_1251
DELETE FROM tmp_1252
DELETE FROM tmp_1253
DE
[/quote] 你可以用游标呀,像7楼给出的语句 你也可以把这print出来的125条先执行删除,多执行两次也可以删掉所有表
-Tracy-McGrady- 2013-07-26
  • 打赏
  • 举报
回复
一楼正解,我同意。
crazy_boom 2013-07-26
  • 打赏
  • 举报
回复
数据库里的tmp_1001 这样的表有300多个 如果是SQL2005 使用
引用 5 楼 wangchangming 的回复:
DECLARE @sql VARCHAR(MAX) = '' SELECT @sql = @sql + 'DELETE FROM ' + NAME + CHAR(10) FROM SYS.TABLES WHERE CHARINDEX('tmp',NAME) > 0 PRINT @sql EXEC(@sql)
的方法就没有问题 但是 sql2000 的话 使用 declare @sql varchar(8000) 有这样的情况

DELETE FROM tmp_1251
DELETE FROM tmp_1252
DELETE FROM tmp_1253
DE
唐诗三百首 2013-07-26
  • 打赏
  • 举报
回复
try this,

declare @tsql varchar(6000),@tabname varchar(200)

declare ap scroll cursor for
  select name from sys.tables where name like 'tmp[_]%'

open ap
fetch first from ap into @tabname

while(@@fetch_status<>-1)
begin
  select @tsql='truncate table '+@tabname
  exec(@tsql)
  fetch next from ap into @tabname
end

close ap
deallocate ap
crazy_boom 2013-07-26
  • 打赏
  • 举报
回复
有这样的情况 由于 tmp_ 开头的表太多 造成 运行 print(@str) 看到最后的几行是这样的结果

DELETE FROM tmp_0122   
DELETE FROM tmp_0123  
DELETE FROM tmp_0124
DELETE FROM tmp_0125    
DELET
数据库中一共有近300个 tmp_开头的表 这才显示了125条 这样如何搞啊
KevinLiu 2013-07-24
  • 打赏
  • 举报
回复
--得到所有的表名 declare @sql varchar(8000) set @sql ='' select @sql+= 'DELETE FROM ' + NAME +' ' + char(13) FROM SYSOBJECTS WHERE XTYPE='U' AND NAME LIKE 'TMP_%' --这样可以一下得出所有要删除的语句 如何执行啊 准备做成JOB 自动来删除 print (@sql) 这条语句可以把SQL拼出来如果没问题你就Exec (@sql)就可以了
wangchangming 2013-07-24
  • 打赏
  • 举报
回复
DECLARE @sql VARCHAR(MAX) = '' SELECT @sql = @sql + 'DELETE FROM ' + NAME + CHAR(10) FROM SYS.TABLES WHERE CHARINDEX('tmp',NAME) > 0 PRINT @sql EXEC(@sql)
wangchangming 2013-07-24
  • 打赏
  • 举报
回复
DECLARE @sql VARCHAR(MAX) = ''
SELECT @sql = @sql + 'DELETE FROM ' + NAME + CHAR(10) FROM SYS.TABLES 
PRINT @sql
EXEC(@sql)
Leon_He2014 2013-07-24
  • 打赏
  • 举报
回复

declare @str varchar(1000)='';
set @str='select * from master.dbo.spt_values'
Exec (@str)
發糞塗牆 2013-07-24
  • 打赏
  • 举报
回复
对于1楼的答案,没啥好说了,不过你如果没where条件,那把DELETE FROM 直接改成truncate table 吧

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧