用sp_msforeachtable编写删除所有表数据的SQL语句,删除语句导致报错

jiling5170 2016-06-18 09:57:27
好久没写存储过程了,现在需要编写一段语句,用于删除所有表中CommunityID为特定值的条件删除,然后我写了如下测试
exec sp_msforeachtable @Command1='
IF COL_LENGTH( ''?'' , ''CommunityID'') IS NOT NULL
BEGIN
DELETE FROM ? WHERE CommunityID = ''ae6d9aeb-bb92-410c-b9d2-a0b514b96da5''
END
ELSE
BEGIN
PRINT N''?''+''不存在''
END'

用sp_msforeachtable循环每个表,命令判断该表是否存在CommunityID字段,存在即删除。
可是会出现每个表都执行过delete,导致部分执行错误,但如果换成select * from ? 就能全部正确查询,为何该判断区分不了删除语句?
...全文
189 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2016-06-18
  • 打赏
  • 举报
回复
sp_msforeachtable是系统隐含的存储过程,没有官方文档,不好解释. 我猜其内部是先产生SQL后编译执行的,当表中不存在CommunityID字段时,编译会报错,所以需用动态SQL的形式.
jiling5170 2016-06-18
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:

exec sp_msforeachtable '
declare @tsql nvarchar(1000)

IF COL_LENGTH(''?'' , ''CommunityID'') IS NOT NULL
BEGIN
  select @tsql=N''delete from ''+''?''+N'' where CommunityID=''''ae6d9aeb-bb92-410c-b9d2-a0b514b96da5'''' ''
  exec(@tsql)
END
ELSE
BEGIN
    PRINT N''?''+''不存在''
END'
高手!可以了道理我都懂,但为什么需要用这种写法呢?难道sp_msforeachtable 只支持select ?还有不明白if控制下依然执行了删除
唐诗三百首 2016-06-18
  • 打赏
  • 举报
回复

exec sp_msforeachtable '
declare @tsql nvarchar(1000)

IF COL_LENGTH(''?'' , ''CommunityID'') IS NOT NULL
BEGIN
  select @tsql=N''delete from ''+''?''+N'' where CommunityID=''''ae6d9aeb-bb92-410c-b9d2-a0b514b96da5'''' ''
  exec(@tsql)
END
ELSE
BEGIN
    PRINT N''?''+''不存在''
END'
Ginnnnnnnn 2016-06-18
  • 打赏
  • 举报
回复
你这个报错是因为某些表里面并不存在 CommunityID 这个字段,遍历每个表的时候就是为每个表都执行一次delete 操作,对于没有CommunityID 这个字段的表,报错就显而易见了

22,209

社区成员

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

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