create proc up_GetUndoneTasks
@Code nvarchar(24),
@PageIndex int,
@PageSize int
as
declare @t1 table
(
MS_Code nvarchar(24),
IR_Time datetime
)
declare @t2 table
(
MS_Code nvarchar(24),
MS_Name nvarchar(50),
IR_Time datetime,
MS_InspectCycle real,
IR_Overdue int
)
declare @sql nvarchar(1000)
begin
insert into @t1(MS_Code,IR_Time) select MS_Code,max(IR_Time) from InspectRecord group by MS_Code
insert into @t2(MS_Code,MS_Name,IR_Time,MS_InspectCycle,IR_Overdue) select
ms.MS_Code,ms.MS_Name,
ir.IR_Time,
ms.MS_InspectCycle,
(datediff(hour,ir.IR_Time,getdate()) - ms.MS_InspectCycle) as IR_Overdue
from MonitorSpotInfo ms, @t1 ir
where ms.MS_Code = ir.MS_Code and
ms.MS_InspectCycle < (datediff(hour,ir.IR_Time,getdate())) and
ir.IR_Time < convert(nvarchar(10),getdate(),120) and ir.MS_Code like @Code+'%'
set @sql = 'select top '+str(@PageSize)+' MS_Code,convert(nvarchar(16),IR_Time,120) as IR_Time,MS_InspectCycle,IR_Overdue from '+str(@t2)+
' where MS_Code not in (select top '+str(@PageSize*(@PageIndex-1))+' MS_Code from '+str(@t2)+')'
exec(@sql)
end
GO服务器: 消息 137,级别 15,状态 2,过程 up_GetUndoneTasks,行 32
必须声明变量 '@t2'。
create proc up_GetUndoneTasks
@Code nvarchar(24),
@PageIndex int,
@PageSize int
as
begin
create table #t1(MS_Code nvarchar(24),IR_Time datetime)
create table #t2(MS_Code nvarchar(24),MS_Name nvarchar(50),IR_Time datetime,MS_InspectCycle real,IR_Overdue int)
declare @sql nvarchar(1000)
begin
insert into #t1(MS_Code,IR_Time) select MS_Code,max(IR_Time) from InspectRecord group by MS_Code
insert into #t2(MS_Code,MS_Name,IR_Time,MS_InspectCycle,IR_Overdue)
select
ms.MS_Code,ms.MS_Name,
ir.IR_Time,
ms.MS_InspectCycle,
(datediff(hour,ir.IR_Time,getdate()) - ms.MS_InspectCycle) as IR_Overdue
from
MonitorSpotInfo ms, #t1 ir
where
ms.MS_Code = ir.MS_Code
and
ms.MS_InspectCycle < (datediff(hour,ir.IR_Time,getdate()))
and
ir.IR_Time < convert(nvarchar(10),getdate(),120) and ir.MS_Code like @Code+'%'
set @sql = 'select top '+str(@PageSize)+' MS_Code,convert(nvarchar(16),IR_Time,120) as IR_Time,MS_InspectCycle,IR_Overdue from #t2 '+
'where MS_Code not in (select top '+str(@PageSize*(@PageIndex-1))+' MS_Code from #t2)'
exec(@sql)
end
end
GO
表变量@t2对于
set @sql = 'select top '+str(@PageSize)+' MS_Code,convert(nvarchar(16),IR_Time,120) as IR_Time,MS_InspectCycle,IR_Overdue
from '+str(@t2)+' where MS_Code not in (select top '+str(@PageSize*(@PageIndex-1))+' MS_Code from '+str(@t2)+')'可见。
但是对于exec(@sql)内部的@sql语句,不可见。可以考虑用临时表替代。
@Code nvarchar(24),
@PageIndex int,
@PageSize int
as begin
declare @t1 table (
MS_Code nvarchar(24),
IR_Time datetime
)
declare @t2 table (
idx int identity(1,1),
MS_Code nvarchar(24),
MS_Name nvarchar(50),
IR_Time datetime,
MS_InspectCycle real,
IR_Overdue int
)
declare @sql nvarchar(1000)
begin
insert into @t1(MS_Code,IR_Time)
select MS_Code,max(IR_Time)
from InspectRecord
group by MS_Code insert into @t2 (MS_Code,MS_Name,IR_Time,MS_InspectCycle,IR_Overdue)
select
ms.MS_Code,
ms.MS_Name,
ir.IR_Time,
ms.MS_InspectCycle,
(datediff(hour,ir.IR_Time,getdate()) - ms.MS_InspectCycle) as IR_Overdue
from MonitorSpotInfo ms, @t1 ir
where ms.MS_Code = ir.MS_Code
and ms.MS_InspectCycle < (datediff(hour,ir.IR_Time,getdate()))
and ir.IR_Time < convert(nvarchar(10),getdate(),120)
and ir.MS_Code like @Code+'%'
select
MS_Code,
convert(nvarchar(16),IR_Time,120) as IR_Time,
MS_InspectCycle,
IR_Overdue
from @t2
where idx between @PageSize*(@PageIndex-1)+1 and @PageSize*(@PageIndex)
end
go
其实这个proc的动态脚本是为了实现"分页",那么可以考虑换一种分页的计算方式。..
@Code nvarchar(24),
@PageIndex int,
@PageSize int)--漏了)
as
declare @t1 table
(
MS_Code nvarchar(24),
IR_Time datetime
)
declare @t2 table
(
MS_Code nvarchar(24),
MS_Name nvarchar(50),
IR_Time datetime,
MS_InspectCycle real,
IR_Overdue int
)
declare @sql nvarchar(1000)
begin
insert into @t1(MS_Code,IR_Time) select MS_Code,max(IR_Time) from InspectRecord group by MS_Code
insert into @t2(MS_Code,MS_Name,IR_Time,MS_InspectCycle,IR_Overdue) select
ms.MS_Code,ms.MS_Name,
ir.IR_Time,
ms.MS_InspectCycle,
(datediff(hour,ir.IR_Time,getdate()) - ms.MS_InspectCycle) as IR_Overdue
from MonitorSpotInfo ms, @t1 ir
where ms.MS_Code = ir.MS_Code and
ms.MS_InspectCycle < (datediff(hour,ir.IR_Time,getdate())) and
ir.IR_Time < convert(nvarchar(10),getdate(),120) and ir.MS_Code like @Code+'%'
set @sql = 'select top '+str(@PageSize)+' MS_Code,convert(nvarchar(16),IR_Time,120) as IR_Time,MS_InspectCycle,IR_Overdue from '+str(@t2)+
' where MS_Code not in (select top '+str(@PageSize*(@PageIndex-1))+' MS_Code from '+str(@t2)+')'
exec(@sql)
end
GO
2005,2008举例.注意变量要用()扩起来.
declare @a int
set @a = 10select top (@a) * from table