在进行客户技术支持时常常会遇到这样的问题,就是客户需要一个功能,但是我们没有办法很好的支持和满足,但是又希望能
够快速的提供客户一个方法,而我最最常见的方法就是利用sql去直接对数据库进行处理
有以下两张表格
一张为,存储序号的信息
一张为,存储的一些和IP地址有关系的memo的表格
但是由于memo中信息太多,并不是每个都有用处,因此需要将memo中的信息剔除一些,保留以下所需要的就可以了。
其中需要提出的信息包括了IP地址,IP地址有个大家都知道,每个段位都是0-255,因此如果要做活了,就要做个循环,笔者我现在只要两层循环就可以了。因为我有一个IP地址循环范围。
drop table #info2
CREATE TABLE #Info2(
event_date datetime NULL,
meter_code varchar(max) NOT NULL,
IP varchar(max) NULL,
Name nvarchar(max) NULL)
这个是一个零时表格,其实在建立零时表格之前,我的所有的测试工作都是在建立的实体表格中建立的。最后只要建立的时候,根据实际建立表格是表格名字建立为#info就可以了,就是一个在一个查询页中的建立的一个零时表格
declare @ip varchar(20)
declare @ipj Varchar(20)
declare @ipi Varchar(20)
declare @name varchar(max)
declare @a varchar(max)
declare @i int
declare @j int
declare @endtime varchar(500)
declare @starttime varchar(500)
在这里我定义了一下变量,其中IP1.IP2.IP3.IP4
这里的IPj指的是IP3 IPi指的是IP4
i和j就是两个和IP数据值有关系的变量 0-255的这个变量
@name和@a是两个之间相互有关系的变量,只是为了方便,将其中一个赋值给另外一个。
set @starttime='2012-08-01 00:00:00' ------------Query Startime
set @endtime='2012-08-07 00:00:00' ------------Query Endtime
这个是为了方便输入时间信息,因为有两条SQL要变化时间
set @j=0
while @j<=22
begin
set @ipj=''+@j+''
set @i=1
while @i<=255
begin
set @ipi=''+@i+''
set @ip='10.72.'+@ipj+'.'+@ipi
SET @a=(select top 1 eventmemo from acquireevent where eventdate between ''+@starttime+'' and ''+@endtime+'' and eventmemo like '%Establish communication link%' and eventmemo like '%'+@ip+':%' order by acquireevent.eventdate desc)
set @name=(SELECT SUBSTRING(@a,PATINDEX('%Concentrator Name:%',@a)+18,200))
insert into #Info2 select top 1 acquireevent.eventdate, meter_record.meter_code,
@ip as ip,
@name as Concentrator_Name/*,
eventmemo*/
from acquireevent
inner join meter_record on acquireevent.changzhanid=meter_record.changzhanid
and acquireevent.ertuid=meter_record.ertuid
where eventdate between ''+@starttime+'' and ''+@endtime+''
and eventmemo like '%Establish communication link%' and eventmemo like '%'+@ip+':%'
order by acquireevent.eventdate desc
set @i=@i+1
end
set @j=@j+1
end
这边就是两个嵌套循环。
set @name=(SELECT SUBSTRING(@a,PATINDEX(‘%Concentrator Name:%',@a)+18,200))
这句话石所有中的最重要的重点,因为原来的memo文件中含有的东西太多,显示出来极不方便去看,而memo总所有的名字都含有Concentrator Name:这个字符,而这里的18 指的就是concentrator name:这个字符的长度,而200就是所显示的长度,这个是我在论坛上提的,高手的回答,如下:
假设:TableA
有以下属性
date
NO
memo
date NO memo
2012-01-01 1 connect from 10.101.1.1 from NO address: 192.168.1.1
2012-01-01 2 connect from 10.101.1.2 from NO address: 192.168.1.2
2012-01-01 3 connect from 10.101.1.3 from NO address: 192.168.1.3
如果我写
select from TableA where memo like '%10.101.1.1%'
那么得到的结果就是
date NO memo
2012-01-01 1 connect from 10.101.1.1 from NO address: 192.168.1.1
我想知道如果我想得到的结果是
date NO memo
2012-01-01 1 10.101.1.1
我的这个SQL该如何去写?
如果你的数据格式固定的话,下面语句可以查找两个from之间的结果,那个5是from这四个字母加上一个空格