临时接到通知,需要临时编写一个SQL Server的脚本,供出差的同事使用一下。

我当时心想这个SQL Server脚本听都没听说过,但是组织说决定就是你了,那我就只能硬着头皮上了。

脚本实现的功能比较简单,在数据库中寻找固定前缀的表,表中都包含[Time]属性,删除三个月(或者...天)的数据。

简单搜索了相关知识,分以下几步实现:

1.获取时间节点并转换为指定格式:

  获取当前日期前指定时间,网上容易百度到,获取到时间节点需要将其转换为固定的格式,具体可参考《Sql中把datetime转换成字符串(CONVERT)》;

  代码如下所示:

 select @logdeldate = (select convert(varchar(100), dateadd(month, -3, getdate()), 21));

2.获取数据库符合要求的指定表:

  此处需要注意获取到的表名需要存储进入临时表中,供后续遍历使用。因为表中数据没有主键,因此需要进行插入Key以便查询(如果有更好的办法,请告知):

 select NULL tmpKey, [name] into #TempTable from [sysobjects] where [type] = 'u' and name like 'T_Status_A%' order by [name];

  此处临时表中的数据记录tmpKey值均为NULL,使用如下语句可以为更新其中一条记录的tmpKey值:

 set rowCount 1
update #TempTable set tmpKey = 1
set rowCount 0

  select rowCount 0的作用为限制接下来执行的SQL语句仅执行一条,比如下一句语句,仅将一条记录的tmpKey值更新为1。

update #TempTable set tmpKey = 1

3.脚本中声明变量,并进行赋值操作

 declare
@i as int,
@deldate as varchar(100), --设备状态表删除时间节点
@logdeldate as varchar(100), --日志表删除时间节点

  上述代码中声明了若干变量,并标注其对应类型。

 select @logdeldate = (select convert(varchar(100), dateadd(month, -3, getdate()), 21));
set @logsql = 'delete from [****].[dbo].[T_Log] where Time < ' + CHAR(39) + @logdeldate + CHAR(39);

  上述代码中对@logdeldate进行赋值,赋值为搜索后的结果;后续设置sql语句给@logsql变量,注意@sql声明时为@logsql as nvarchar(MAX),,非varchar(MAX)。

  注:CHAR(39)为单引号。

4.遍历结果集,并执行语句

 set @i = 0;                        --初始化计数
while @i < @deltablecount
Begin
set rowCount 0
select @tablename = (select [name] from #TempTable where tmpKey = 1)
delete from #TempTable where tmpKey = 1 set rowCount 1
update #TempTable set tmpKey = 1
set rowCount 0 set @statussql = 'delete from ' + QUOTENAME(@tablename) + ' where [Time] < ' + CHAR(39) + @deldate + CHAR(39);
print @statussql
exec(@statussql)
Set @i = @i + 1
End
GO

  上述代码为遍历结果集,拼接新的SQL语句并执行。

  最后附上此次的脚本,因为初次编写,有诸多不满意之处,但是也不知道如何改进,如果各位看后有改进方法请告知。

  最后附上完整代码:

--删除数据库指定日期数据前,请确认操作不可逆转
USE [****]
GO --------------------------------------------------------------------------------------------------------------------------------------- --选取符合要求的表,存储进临时表中供后续遍历
select NULL tmpKey, [name] into #TempTable from [sysobjects] where [type] = 'u' and name like 'T_Status_A%' order by [name];
GO set rowCount 1
update #TempTable set tmpKey = 1
set rowCount 0 --------------------------------------------------------------------------------------------------------------------------------------- declare
@i as int,
@deldate as varchar(100), --状态表删除时间节点
@logdeldate as varchar(100), --日志表删除时间节点
@tablename as varchar(100),
@deltablecount as int, --需要删除的数据库总数
@logsql as nvarchar(MAX),
@realsql as nvarchar(MAX),
@statussql as nvarchar(MAX); select @deltablecount = COUNT(*) from #TempTable; --------------------------------------------------------------------------------------------------------------------------------------- --设置日志表的删除时间节点(默认删除三个月以前的数据)
select @logdeldate = (select convert(varchar(100), dateadd(month, -3, getdate()), 21));
set @logsql = 'delete from [****].[dbo].[T_Log] where Time < ' + CHAR(39) + @logdeldate + CHAR(39);
print(@logsql)
exec(@logsql) --------------------------------------------------------------------------------------------------------------------------------------- --设置设备状态表删除时间(默认删除三个月以前的数据)
select @deldate = (select convert(varchar(100), dateadd(month, -3, getdate()), 21)); set @i = 0; --初始化计数
while @i < @deltablecount
Begin
set rowCount 0
select @tablename = (select [name] from #TempTable where tmpKey = 1)
delete from #TempTable where tmpKey = 1 set rowCount 1
update #TempTable set tmpKey = 1
set rowCount 0 set @statussql = 'delete from ' + QUOTENAME(@tablename) + ' where [Time] < ' + CHAR(39) + @deldate + CHAR(39);
print @statussql
exec(@statussql)
Set @i = @i + 1
End
GO drop table #TempTable
GO

PS:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!

  

SQLServer脚本编写的更多相关文章

  1. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  2. Linux 脚本编写基础

    txt去重    http://man.linuxde.net/sort Linux 脚本编写基础 http://www.cnblogs.com/linn/archive/2007/03/05/664 ...

  3. SecureCRT中python脚本编写

    SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是Secu ...

  4. LoadRunner脚本编写(转)

    性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员 ...

  5. shell脚本编写方法

    shell脚本编写就如同一门语言,涉及到运行环境.基本语法.变量定义.函数.参数(系统参数).条件判定.执行流程控制 等等问题. 本文就以下几个方面进行描述: 运行环境: shell  shebang ...

  6. Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

    日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...

  7. 一个很不错的bash脚本编写教程

    转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...

  8. shell脚本编写笔记

    包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...

  9. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

随机推荐

  1. NodeManager介绍

    原文链接: http://blog.csdn.net/zhangzhebjut/article/details/37730013 参考文档: https://blog.csdn.net/u013384 ...

  2. 设计模式学习心得<原型模式 Prototype >

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式是实现了一个原型接口,该接口用于创建当 ...

  3. python 解方程 和 python 距离公式实现

    解方程参考:https://zhuanlan.zhihu.com/p/24893371 缺点太慢,最后还是自己算了 距离公式参考:https://www.cnblogs.com/denny402/p/ ...

  4. 使用Tenorshare iCareFone for mac为iPhone做系统修复

    tenorshare icarefonemac中文版采用一键式方法来保护,修理,清洁,优化并最终加快您的iPhone,iPad和iPod的速度.它可以帮助您轻松解决所有iOS问题,并让您的iPhone ...

  5. Task与线程池

    尽量使用Task,而不是线程池 因为Task是基于线程的,单不是一一对应的 Task的切换与开销要比线程小很多,也更容易管理 http://www.cnblogs.com/yunfeifei/p/41 ...

  6. oo第八次作业

    oo第八次作业 第五次作业分析: 1.度量图: 2.类图: 第五次作业由于是第一次接触多线程,所以导致自己的经验不足,因此最终也没有完成作业,到最后任然不能实现三部电梯的有效调度,所以导致了这次作业的 ...

  7. PCL-CMAKELIST书写格式

    cmake_minimum_required(VERSION 2.6 FATAL_ERROR)//cmake最小版本 find_package(PCL 1.3 REQUIRED COMPONENTS ...

  8. 【Selenium】【BugList6】调用IE,未启用保护模式,报:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones.

    >>> driver = webdriver.Ie() 解决方法: 1.打开Ie浏览器 , 工具 ->Internet选项 ->安全 2.去掉4个区域的安全保护模式

  9. Python开发——10.面向对象编程进阶

    一.isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls) 判断obj是不是由cls产生的类 2.issubclass(sub, ...

  10. 【原创】岁月如歌 一款网易歌单生成pdf的软件

    介绍 这是一款可以将网易云音乐的歌单中所有歌词输出为pdf的软件. 项目持续维护地址 http://brightguo.com/song-list-to-pdf/ 目前没有搜到相关网易歌单导出为pdf ...