在以数据库为基础的应用程序开发中分页是一个比较常用的操作
可惜的是SQL Server中没有Oracle中相应的ROWNUM属性可用
用触发器生成一个ROWNUM列]
勉强可以一用当然用如下的SQL语句也可以生成第i页每页n行tid是主键列
select top n * from tab
where strWhere and tid>(select max(tid)
from (select top (i)*n tid from tab where strWhere order by tid ) as T)
)
order by tid
也可以但是我想用另一种方法也未尝不可
因此就有自动生成ROWNUM列的想法
eg:
建表
CREATE TABLE [dbo][orderEmp] (
[rownum] [int] NOT NULL 同时该列要求有唯一性约束
[ordID] [int] IDENTITY ( ) NOT NULL 主键列
[empID] [int] NOT NULL
[empTxt] [varchar] () COLLATE Chinese_PRC_CI_AS NOT NULL
[empDate] [datetime] NOT NULL 此列上建聚集索引
) ON [PRIMARY]
对插入语句处理的触发器
CREATE TRIGGER orderEmpAddTrg
ON orderEmp
instead of INSERT
AS
begin
declare @rw int
select @rw=
select @rw=max(rownum) from orderEmp
if(@rw is null)
select @rw=
select @rw=@rw+
INSERT INTO orderEmp(rownumempIDempTxtempDate)
SELECT @rw iempIDiempTxtiempDate
FROM inserted i
end
删除的触发器
CREATE TRIGGER orderEmpDelTrg
ON dboorderEmp
FOR DELETE
AS
begin
set nocount on
declare @rw int
declare @tab table(rw int)
insert into @tab
select rownum from deleted
order by rownum desc 不可以掉至于为什么大家自己试试就知道了
declare cp cursor
for
select rw from @tab
open cp
fetch next from cp into @rw
while @@fetch_status=
begin
update orderEmp
set rownum=rownum
where rownum>@rw
fetch next from cp into @rw
end
close cp
deallocate cp
set nocount off
end
这个触发器是为屏掉用户直接从SQL企业管理器 打开表后对表中的ROWNUM列进行修改
可能不完全
但是通过UPdate语句操作表的时只要不修改rownum列是不会出现问题的
CREATE TRIGGER orderEmpUpdTrg
ON orderEmp
FOR UPDATE
AS
begin
IF UPDATE (rownum)
RAISERROR (ROWNUM列不可以自行修改! )
ROLLBACK TRANSACTION
end
添加新记录的存储过程如下
create PROCEDURE [addOrderEmp]
( @empID [int]
@empTxt [varchar]()
@empDate [datetime])
AS INSERT INTO [orderEmp]
( [rownum] [empID] [empTxt] [empDate])
VALUES
( @empID @empTxt @empDate)是一定要的但是不会影响ROWNUM列只是为了
占用内存而已
下面是我的测试用例:
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
insert into orderemp(rownumempidemptxtempdate)
values( ddfddgetdate())
select * from orderemp order by rownum
delete from orderemp where empid> and empid<
select * from orderemp order by rownum
至于更新的语句吗
只要不更新ROWNUM列就不用处理了
注一定要把数据库的服务器设置>服务器行为>第二个选项不要选中