SQL Server 2012

老哥真稳 2017-09-04 09:47:59
描述:
SQL Server 2012
库:Test
表:A
字段:B
目标:
选择该表前5000行,通过字段B筛选出值不等于"0"的行并删除。
大佬在哪里?
求教育。
...全文
256 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2017-09-04
  • 打赏
  • 举报
回复
set rowcount 5000
delete from Test.dbo.A where B<>'0'
大量删除记录日志产生比较多,可一次只删除100条,循环删除。 如果删除的超过了半数, 还不如将旧表改名,保留值插入到新表,新表作为正式表,旧表drop掉。 一般不太重要的库, 不建议将恢复模式改为完整日志, 简单日志即可, 这样日志可自动重用,不需要太多的维护。
alter database 数据库名 set recovery SIMPLE
二月十六 2017-09-04
  • 打赏
  • 举报
回复
引用 5 楼 qq_39866008 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:]
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY GETDATE()) AS num FROM A
)
DELETE FROM cte WHERE num<5000 AND B<>'0'
请问版主,假如在删除数据过程中日志文件迅速增大,在磁盘空间不是很充裕的情况下,怎么处理为好?[/quote] 删除前可以先收缩一下日志(做好备份)
 alter database 数据库名 set recovery SIMPLE --设置为简单模式
 dbcc shrinkfile('数据库日志名名') --like 数据库名_log 
 alter database  数据库名set recovery FULL --恢复模式
或者尝试循环删除数据,不一次性删除多条
老哥真稳 2017-09-04
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY GETDATE()) AS num FROM A
)
DELETE FROM cte WHERE num<5000 AND B<>'0'
请问版主,假如在删除数据过程中日志文件迅速增大,在磁盘空间不是很充裕的情况下,怎么处理为好?
老哥真稳 2017-09-04
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY GETDATE()) AS num FROM A
)
DELETE FROM cte WHERE num<5000 AND B<>'0'
版主有心了,谢谢!
老哥真稳 2017-09-04
  • 打赏
  • 举报
回复
引用 1 楼 z10843087 的回复:
[quote=引用 楼主 qq_39866008 的回复:] 描述: SQL Server 2012 库:Test 表:A 字段:B 目标: 选择该表前5000行,通过字段B筛选出值不等于"0"的行并删除。 大佬在哪里? 求教育。
use test

delete top (5000) from A where B<>0
[/quote]谢谢,先试下
二月十六 2017-09-04
  • 打赏
  • 举报
回复
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY GETDATE()) AS num FROM A
)
DELETE FROM cte WHERE num<5000 AND B<>'0'
OwenZeng_DBA 2017-09-04
  • 打赏
  • 举报
回复
引用 楼主 qq_39866008 的回复:
描述: SQL Server 2012 库:Test 表:A 字段:B 目标: 选择该表前5000行,通过字段B筛选出值不等于"0"的行并删除。 大佬在哪里? 求教育。
use test

delete top (5000) from A where B<>0
老哥真稳 2017-09-04
  • 打赏
  • 举报
回复
引用 7 楼 yenange 的回复:
set rowcount 5000
delete from Test.dbo.A where B<>'0'
大量删除记录日志产生比较多,可一次只删除100条,循环删除。 如果删除的超过了半数, 还不如将旧表改名,保留值插入到新表,新表作为正式表,旧表drop掉。 一般不太重要的库, 不建议将恢复模式改为完整日志, 简单日志即可, 这样日志可自动重用,不需要太多的维护。
alter database 数据库名 set recovery SIMPLE
666,学习了!谢谢大佬!
老哥真稳 2017-09-04
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
[quote=引用 5 楼 qq_39866008 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:]
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY GETDATE()) AS num FROM A
)
DELETE FROM cte WHERE num<5000 AND B<>'0'
请问版主,假如在删除数据过程中日志文件迅速增大,在磁盘空间不是很充裕的情况下,怎么处理为好?[/quote] 删除前可以先收缩一下日志(做好备份)
 alter database 数据库名 set recovery SIMPLE --设置为简单模式
 dbcc shrinkfile('数据库日志名名') --like 数据库名_log 
 alter database  数据库名set recovery FULL --恢复模式
或者尝试循环删除数据,不一次性删除多条 [/quote]循环删除?听起来有点深奥呀,有时间方便的话麻烦多指导下

22,300

社区成员

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

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