SQL server数据库中,怎么删除除了个别两个表外的所有表的数据。

u014756478 2018-01-31 10:05:27
注意是 除了其中个别某两个表外的所有表中的数据,求大神支招
...全文
966 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-01-31
  • 打赏
  • 举报
回复
引用 11 楼 zjcxc 的回复:
用 object_id 来判断,简化名称休闲裤, sp_msforeachtabe 的的名称是很标准的 [架构名].[表名] 的形式, 用 object_id 的话,你要排除的表名不必遵守这种格式,能正确查出 object_id 的写法均可 sp_msforeachdb 执行的时候带库名,这样避免你的当前库不正确导致删错 其他的解释看注释
-- 如果要稳妥,先查下删除的表是否正确
exec tempdb..sp_msforeachtable '
if object_id(''?'') in ( object_id(''要保留的表1''), object_id(''要保留的表2'') ) return;
print ''?'''

-- 先把约束禁用(这样主外键不再束缚我们的操作顺序了,缺点是如果之前有禁用的约束,则后面的启用也会启用)
exec tempdb..sp_msforeachtable 'alter table ? nocheck constraint all'

-- 删除
exec tempdb..sp_msforeachtable '
if object_id(''?'') in ( object_id(''要保留的表1''), object_id(''要保留的表2'') ) return;
-- 如果 truncate 失败,使用 delete,这样无法 truncate 的表也能处理了
begin try
	truncate table ?
end try
begin catch
	delete from ?
end catch'

-- 完成后启用约束
exec tempdb..sp_msforeachtable 'alter table ? check constraint all'
确实应该这样, sp_msforeachtable 中的表名类似 [dbo].[tableName] , 你这种写法更好
u014756478 2018-01-31
  • 打赏
  • 举报
回复
引用 11 楼 zjcxc 的回复:
用 object_id 来判断,简化名称休闲裤, sp_msforeachtabe 的的名称是很标准的 [架构名].[表名] 的形式, 用 object_id 的话,你要排除的表名不必遵守这种格式,能正确查出 object_id 的写法均可 sp_msforeachdb 执行的时候带库名,这样避免你的当前库不正确导致删错 其他的解释看注释
-- 如果要稳妥,先查下删除的表是否正确
exec tempdb..sp_msforeachtable '
if object_id(''?'') in ( object_id(''要保留的表1''), object_id(''要保留的表2'') ) return;
print ''?'''

-- 先把约束禁用(这样主外键不再束缚我们的操作顺序了,缺点是如果之前有禁用的约束,则后面的启用也会启用)
exec tempdb..sp_msforeachtable 'alter table ? nocheck constraint all'

-- 删除
exec tempdb..sp_msforeachtable '
if object_id(''?'') in ( object_id(''要保留的表1''), object_id(''要保留的表2'') ) return;
-- 如果 truncate 失败,使用 delete,这样无法 truncate 的表也能处理了
begin try
	truncate table ?
end try
begin catch
	delete from ?
end catch'

-- 完成后启用约束
exec tempdb..sp_msforeachtable 'alter table ? check constraint all'
谢谢
zjcxc 元老 2018-01-31
  • 打赏
  • 举报
回复
用 object_id 来判断,简化名称休闲裤, sp_msforeachtabe 的的名称是很标准的 [架构名].[表名] 的形式, 用 object_id 的话,你要排除的表名不必遵守这种格式,能正确查出 object_id 的写法均可 sp_msforeachdb 执行的时候带库名,这样避免你的当前库不正确导致删错 其他的解释看注释
-- 如果要稳妥,先查下删除的表是否正确
exec tempdb..sp_msforeachtable '
if object_id(''?'') in ( object_id(''要保留的表1''), object_id(''要保留的表2'') ) return;
print ''?'''

-- 先把约束禁用(这样主外键不再束缚我们的操作顺序了,缺点是如果之前有禁用的约束,则后面的启用也会启用)
exec tempdb..sp_msforeachtable 'alter table ? nocheck constraint all'

-- 删除
exec tempdb..sp_msforeachtable '
if object_id(''?'') in ( object_id(''要保留的表1''), object_id(''要保留的表2'') ) return;
-- 如果 truncate 失败,使用 delete,这样无法 truncate 的表也能处理了
begin try
	truncate table ?
end try
begin catch
	delete from ?
end catch'

-- 完成后启用约束
exec tempdb..sp_msforeachtable 'alter table ? check constraint all'
u014756478 2018-01-31
  • 打赏
  • 举报
回复
引用 8 楼 yenange 的回复:
[quote=引用 6 楼 u014756478 的回复:] [quote=引用 4 楼 yenange 的回复:] 上面是为了确保无误, 如果你确认对应的库、逻辑都没有问题, 可以一步到位:
--清空所有除 t1, t2 之外的表的所有记录
EXEC sp_msforeachtable 'if "?" not in ("t1","t2") truncate table ? '
表内的约束什么的,会不会引起报错?[/quote] 如果你没有专门建立什么外键, 就不会有问题。 如果有那就麻烦了, 只能先清空主表, 再清空子表[/quote] 谢谢 大体上的逻辑已经清楚了。
zjcxc 元老 2018-01-31
  • 打赏
  • 举报
回复
不能对以下表使用 TRUNCATE TABLE: 由 FOREIGN KEY 约束引用的表。(您可以截断具有引用自身的外键的表。) 参与索引视图的表。 通过使用事务复制或合并复制发布的表。 对于具有以上一个或多个特征的表,请使用 DELETE 语句。
吉普赛的歌 2018-01-31
  • 打赏
  • 举报
回复
引用 6 楼 u014756478 的回复:
[quote=引用 4 楼 yenange 的回复:] 上面是为了确保无误, 如果你确认对应的库、逻辑都没有问题, 可以一步到位:
--清空所有除 t1, t2 之外的表的所有记录
EXEC sp_msforeachtable 'if "?" not in ("t1","t2") truncate table ? '
表内的约束什么的,会不会引起报错?[/quote] 如果你没有专门建立什么外键, 就不会有问题。 如果有那就麻烦了, 只能先清空主表, 再清空子表
u014756478 2018-01-31
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
删除需谨慎
declare @tablename NVARCHAR(100)
declare auth_cur cursor for
SELECT  b.name 
FROM    sysindexes AS a
        INNER JOIN sys.tables AS b ON b.object_id = a.id
WHERE   indid IN ( 0, 1 );
open auth_cur
fetch next from auth_cur into @tablename
while (@@fetch_status=0)
  begin
    IF(@tablename<>'test') --排除个别表
	BEGIN
    EXEC('delete from '+@tablename)
	END
    fetch next from auth_cur into @tablename
  end
close auth_cur
deallocate auth_cur


表内的约束什么的,会不会引起报错?
u014756478 2018-01-31
  • 打赏
  • 举报
回复
引用 4 楼 yenange 的回复:
上面是为了确保无误, 如果你确认对应的库、逻辑都没有问题, 可以一步到位:
--清空所有除 t1, t2 之外的表的所有记录
EXEC sp_msforeachtable 'if "?" not in ("t1","t2") truncate table ? '
表内的约束什么的,会不会引起报错?
u014756478 2018-01-31
  • 打赏
  • 举报
回复
表内的约束什么的,会不会引起报错?
吉普赛的歌 2018-01-31
  • 打赏
  • 举报
回复
上面是为了确保无误, 如果你确认对应的库、逻辑都没有问题, 可以一步到位:
--清空所有除 t1, t2 之外的表的所有记录
EXEC sp_msforeachtable 'if "?" not in ("t1","t2") truncate table ? '
二月十六 版主 2018-01-31
  • 打赏
  • 举报
回复
删除需谨慎
declare @tablename NVARCHAR(100)
declare auth_cur cursor for
SELECT  b.name 
FROM    sysindexes AS a
        INNER JOIN sys.tables AS b ON b.object_id = a.id
WHERE   indid IN ( 0, 1 );
open auth_cur
fetch next from auth_cur into @tablename
while (@@fetch_status=0)
  begin
    IF(@tablename<>'test') --排除个别表
	BEGIN
    EXEC('delete from '+@tablename)
	END
    fetch next from auth_cur into @tablename
  end
close auth_cur
deallocate auth_cur


吉普赛的歌 2018-01-31
  • 打赏
  • 举报
回复
--t1,t2 请修改成你对应的表名
--清空所有除 t1, t2 之外的表的所有记录
EXEC sp_msforeachtable 'if "?" not in ("t1","t2") print "truncate table ?" '
--输出的结果, 你审查一下没有问题, 复制出来再执行就可以了
u014756478 2018-01-31
  • 打赏
  • 举报
回复
在线等啊来人看下

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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