- 论坛徽章:
- 0
|
我有一张表,表结构如下:
flowid INT PRIMARY_KEY
srcip CHAR(15)
srcport INT(4)
dstport CHAR(15)
dstport INT(4)
prot INT(4)
packets INT(4)
bytes INT(4)
如果创建一个储存过程,用来统计从唯一的srcip的srcport端口到唯一的dstip的dstport的使用prot承载的流量?
我写的储存过程如下:
Create Procedure AggregateRecord @agg_days INT AS
Declare @srcip NVARCHAR(50)
Declare @srcport INT
Declare @dstip NVARCHAR(50)
Declare @dstport INT
Declare @prot INT
Declare @flows INT
Declare @packets BIGINT
Declare @bytes BIGINT
Declare @ctr_srcip BIGINT
Declare @ctr_srcport INT
Declare @ctr_dstip BIGINT
Declare @ctr_dstport INT
Declare @ctr_prot INT
Declare @ctr_flows INT
Declare srcip_cs Cursor For
SELECT DISTINCT srcaddr
FROM netflow_record
Where DateDiff(Dy,rece_time,GetDate()) >= @agg_days
For Read Only
Open srcip_cs
SET @ctr_srcip = @@CURSOR_ROWS
While (@ctr_srcip > 0) Begin
SET @ctr_srcip = @ctr_srcip - 1
Fetch Next
From srcip_cs
INTO @srcip
--第二层循环
Declare srcport_cs Cursor For
SELECT DISTINCT srcPort
FROM netflow_record
Where (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
For Read Only
Open srcport_cs
SET @ctr_srcport = @@CURSOR_ROWS
While (@ctr_srcport > 0) Begin
SET @ctr_srcport = @ctr_srcport - 1
Fetch Next
From srcport_cs
INTO @srcport
--第三层循环
Declare dstip_cs Cursor For
SELECT DISTINCT dstaddr
FROM netflow_record
WHERE (srcPort = @srcport) AND (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
For Read Only
Open dstip_cs
SET @ctr_dstip = @@CURSOR_ROWS
While (@ctr_dstip>0) Begin
SET @ctr_dstip = @ctr_dstip - 1
Fetch Next
From dstip_cs
INTO @dstip
--第四层循环
Declare dstport_cs Cursor For
SELECT DISTINCT dstPort
FROM netflow_record
WHERE (dstaddr = @dstip) AND (srcPort = @srcport) AND (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
For Read Only
Open dstport_cs
SET @ctr_dstport = @@CURSOR_ROWS
While (@ctr_dstport > 0) Begin
SET @ctr_dstport = @ctr_dstport - 1
Fetch Next
From dstport_cs
INTO @dstport
--第五层循环
Declare prot_cs Cursor For
SELECT DISTINCT protocol
FROM netflow_record
WHERE (dstaddr = @dstip) AND (dstPort = @dstport) AND (srcPort = @srcport) AND (srcaddr = @srcip) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
For Read Only
Open prot_cs
SET @ctr_prot = @@CURSOR_ROWS
While(@ctr_prot > 0) Begin
SET @ctr_prot = @ctr_prot - 1
Fetch Next
From prot_cs
INTO @prot
--最后识别
Declare flow_cs Cursor For
SELECT packets,bytes
FROM netflow_record
WHERE (dstaddr = @dstip) AND (dstPort = @dstport) AND (srcPort = @srcport) AND (srcaddr = @srcip) AND (protocol = @prot) AND (DateDiff(Dy,rece_time,GetDate()) >= @agg_days)
For Read Only
Declare @flows_t INT
Declare @packets_t BIGINT
Declare @bytes_t BIGINT
SET @flows_t = 0
SET @packets_t = 0
SET @bytes_t = 0
Open flow_cs
SET @ctr_flows = @@CURSOR_ROWS
While(@ctr_flows > 0) Begin
SET @ctr_flows = @ctr_flows - 1
Fetch Next
From flow_cs
INTO @packets,@bytes
Set @flows_t = @flows_t + 1
Set @packets_t = @packets_t + @packets
Set @bytes_t = @bytes_t + @bytes
END
--最后识别
INSERT INTO aggregate (srcIP,srcPort,dstIP,dstPort,prot,flows,packets,bytes,agg_time) VALUES (@srcip, @srcport, @dstip, @dstport, @prot, @flows_t, @packets_t, @bytes_t, getdate())
END
--第五层循环
END
--第四层循环
END
--第三层循环
END
--第二层循环
END
Close flow_cs
Close prot_cs
Close dstport_cs
Close dstip_cs
Close srcip_cs
Close srcport_cs
Deallocate flow_cs
Deallocate prot_cs
Deallocate dstport_cs
Deallocate dstip_cs
Deallocate srcip_cs
Deallocate srcport_cs
我想将最后的结果保存到aggregate数据库中,结果只看到数据库中有一条记录,请高手帮忙指正。 |
|