SQLServer脚本编写
临时接到通知,需要临时编写一个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脚本编写的更多相关文章
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- Linux 脚本编写基础
txt去重 http://man.linuxde.net/sort Linux 脚本编写基础 http://www.cnblogs.com/linn/archive/2007/03/05/664 ...
- SecureCRT中python脚本编写
SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是Secu ...
- LoadRunner脚本编写(转)
性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员 ...
- shell脚本编写方法
shell脚本编写就如同一门语言,涉及到运行环境.基本语法.变量定义.函数.参数(系统参数).条件判定.执行流程控制 等等问题. 本文就以下几个方面进行描述: 运行环境: shell shebang ...
- Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题
日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...
- 一个很不错的bash脚本编写教程
转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...
- shell脚本编写笔记
包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...
- (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
随机推荐
- [精华][推荐]CAS SSO 实现单点登录实例源码
1.修改server.xml文件,如下: 注意: 这里使用的是https的认证方式,需要将这个配置放开,并做如下修改: <Connector port="8443" prot ...
- faster-rcnn 笔记
2019-02-18,15点00 ''' 下面是别人写的原始的笔记,我在上面自己补充了一些. ''' #https://www.cnblogs.com/the-home-of-123/p/974796 ...
- maven跳过测试编译命令
mvn clean install/package/deploy -Dmaven.test.skip=true
- Scrapy爬虫框架的学习
第一步安装 首先得安装它,我使用的pip安装的 因为我电脑上面安装了两个python,一个是python2.x,一个是python3.x,所以为了区分,所以,在cmd中,我就使用命令:python2 ...
- 高速上手C++11 14 笔记1
1 constexpr constexpr关键字可以让已经具备常量返回的函数运用于常量的位置. c++14起可以在函数内部使用局部变量.循环和分支等简单语句. 2 委托构造&继承构造 委托构造 ...
- python简单入门
一. 初识python. 1. 认识计算机 CPU(大脑) 3GHZ + 内存(DDR4) + 主板 + 电源(心脏)+ 显示器 + 键盘 +鼠标+ 显卡 + 硬盘 80MB/s 操作系统 windo ...
- c++中段自评
不知不觉,学期已过一大半.也是时候对自己的编程水平重新进行一次评估了. 1.通过最近的中段测试和acm新手赛的洗礼,以及之前的课前预习.课中学习.和课后作业的锻炼,我逐渐体会到编程语言的魅力同时也理解 ...
- lsf运行lsload命令显示“lsload: Host does not have a software license”
因为这个问题也是花费好长时间了,对一个小白的我来说真的挺激动的.下面说一下我的解决思路吧.不过造成这个问题也有很多种原因,需要对症下药. 我入手解决是从这个网站上看到同样的问题,然后通过一个个排除最后 ...
- hbase单机版安装+phoneix SQL on hbase 单节点安装
hbase 单机安装部署及phoneix 单机安装 Hbase 下载 (需先配置jdk) https://www.apache.org/dyn/closer.lua/hbase/2.0.1/hbase ...
- python-mysql驱动64位
安装Python-MySQL驱动一直没有成功: https://pypi.python.org/pypi/MySQL-python/1.2.5#downloads 上面网站下的版本安装都不能通过 提示 ...