读书人

求存储过程中游标的用法解决思路

发布时间: 2012-03-23 12:06:21 作者: rapoo

求存储过程中游标的用法
各位,以下是我得存储过程,功能是将一张表的数据取出放在另一张临时表里,取的条件是将原表里的时间字段对应的值每隔5分钟取一条。我在我不会写的地方写上了标记。请帮帮忙

CREATE PROCEDURE usp_QueryRawData1
@start varchar(50),--开始日期
@end varchar(50),--结束日期
@tagIDs varchar(3000),--需要检索的点集合
@recordPerPage int,--每页的记录行数
@timespan int
--@sort int --排序方式
AS
-- 指定表名、列名
declare @lTable char(50)
declare @lColTag char(50)
declare @lColPrimary char(50)
declare @lColTime char(50

set @lTable = '#ttt '
set @lColTag = 'TagId '
set @lColPrimary = 'ID '
set @lColTime = '[TimeStamp] '

-- 定义局部变量,用来构造SQL语句
declare @strSQL char(8000)--定义SQL语句,获取指定的页的纪录
declare @strWhere varchar(3900)--定义条件语句


--条件语句--------------------------begin

set @strWhere = ' '
-- 开始日期
if(ltrim(rtrim(@start)) <> ' ')
set @strWhere = ' cast( ' + cast(@lColTime as varchar(20)) + ' as DateTime) > = cast( ' ' '+cast(@start as varchar(20))+ ' ' ' as DateTime) '

-- 结束日期
if(ltrim(rtrim(@end)) <> ' ')
set @strWhere = ltrim(@strWhere) + ' and cast( ' ' ' + cast(@end as varchar(20))+ ' ' 'as DateTime) > = cast( '+ cast(@lColTime as varchar(20)) + ' as DateTime) '

--排序方式
--if(ltrim(rtrim( @sort))=0)
--set @sort = 1
--条件语句--------------------------end

--定义临时表,保存符合检索条件的多个表的纪录----------------begin
create table #ttt
(
ID int,
TagId int,
IOValue varchar(32),
[TimeStamp] datetime,
Quality smallint,
SamplingMode tinyint
)
从这里开始我不会写了
declare @Tempstart datetime
declare @Tempend datetime
declareu_cursor CURSOR


--set @Tempstart=@start


open u_cursor
fetch next from u_cursor into

while (@@fetch_status <> -1)
begin
if (@@fetch_status <> -2)
begin
insert into #ttt
exec usp_QueryTempRawData @Tempstart,@end,@tagIDs
end
fetch next from u_cursor
set @Tempstart=dateadd(minute,@timespan,@Tempstart)
set @Tempend=dateadd(minute,1,@Tempstart)

END

到这里结束

--定义临时表,保存符合检索条件的多个表的纪录----------------end


-- SQL

-- 判断条件是否为空
if(ltrim(rtrim(@strWhere)) <> ' ')
set @strSQL = 'select case when (count(*) < '+cast(@recordPerPage as varchar(50))+ ') '
+ ' and (count(*)!=0) '
+ ' then ' '1 ' ' else CEILING(cast(count(*) as decimal)/ '+cast(@recordPerPage as varchar(50))+ ') end '
+ ' as count from '+ cast(@lTable as varchar(20)) + ' where ' + ltrim(rtrim(cast(@strWhere as varchar(3900))))
else
set @strSQL = 'select case when (count(*) < '+cast(@recordPerPage as varchar(50))+ ') '
+ ' and (count(*)!=0) '
+ ' then ' '1 ' ' else CEILING(cast(count(*) as decimal)/ '+cast(@recordPerPage as varchar(50))+ ') end '
+ ' as count from '+ cast(@lTable as varchar(20))
-- 执行SQL语句,返回结果集
exec(@strSQL)
GO

[解决办法]
select * from [table] where datediff(minute,@start,[TimeStamp]) % 5=0 and [TimeStamp] between @start and @end

读书人网 >SQL Server

热点推荐