临时接到通知,需要临时编写一个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. python-常见用法

    一.注释 单行注释:#后全部注释 多行注释:'''所有内容'''  或者使用 """所有内容"""  ,多行注释用三对单引号或双引号包裹 二 ...

  2. 结对项目——四则运算GUI项目

    一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...

  3. Javaweb拦截器

    http://blog.csdn.net/reggergdsg/article/details/52962774

  4. GUI学习之四——QWidget控件学习总结

    上一章将的QObject是PyQt里所有控件的基类,并不属于可视化的控件.这一章所讲的QWidget,是所有可视化控件的基类. QWidget包含下面几点特性 a.控件是用户界面的最小的元素 b.每个 ...

  5. Unity - Photon PUN 本地与网络同步的逻辑分离 (二)

    上篇实现了事件系统的设计,这篇就来结合发送RPC消息 并且不用标记 [PunRPC] 先来看下上编的代码 GameEnvent.cs private static Dictionary<Comm ...

  6. Linux无法正常连接服务器,无法连接上 127.0.0.1:8989 (127.0.0.1)。 - connect (111: 拒绝连接)

    最近修改了下电脑的hosts文件,电脑就突然不能连接下载更新的服务器了,但是浏览器还能正常上网,这让我很是难受啊!!! 错误现象如下: 错误:1 http://archive.ubuntukylin. ...

  7. .net数据库实现Excel的导入与导出

    .net数据库实现Excel的导入与导出 参考路径:https://www.cnblogs.com/splendidme/archive/2012/01/05/2313314.html 1.defau ...

  8. py3.0第四天 函数

    列表生成 # -*- coding: utf-8 -*- # data =[1,2,3] # for index,i in enumerate(data): # print (index,i) # d ...

  9. \usepackage{ulem}带下划线的问题解决

    其实正文应该是斜体字的,但是有可能默认模板会导致斜体变下划线的问题,解决方法如下: \usepackage{ulem} 在 \documentclass[format=acmsmall, review ...

  10. 中标麒麟(linux)下Qt调用python数据转换

    转自:https://blog.csdn.net/itas109/article/details/78733478 mytest.py文件 # -*- coding: utf-8 -*- def he ...