在以數據庫為基礎的應用程序開發中,分頁是一個比較常用的操作,
可惜的是SQL Server2000中沒有Oracle中相應的ROWNUM屬性可用,
小弟用”觸發器“生成一個ROWNUM列]
勉強可以一用,當然用如下的SQL語句也可以生成第i頁,每頁n行,tid是主鍵列,
select top n * from tab
where strWhere and tid>(select max(tid)
from (select top (i-1)*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 (1, 1) NOT NULL ,---主鍵列
[empID] [int] NOT NULL ,
[empTxt] [varchar] (50) 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=0
select @rw=max(rownum) from orderEmp
if(@rw is null)
select @rw=0
select @rw=@rw+1
INSERT INTO orderEmp(rownum,empID,empTxt,empDate)
SELECT @rw, i.empID,i.empTxt,i.empDate
FROM inserted i
end
---刪除的“觸發器'
CREATE TRIGGER orderEmpDelTrg
ON dbo.orderEmp
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=0
begin
update orderEmp
set rownum=rownum-1
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列不可以自行修改!
', 16, 1)
ROLLBACK TRANSACTION
end
添加新記錄的存儲過程如下:
create PROCEDURE [addOrderEmp]
( @empID [int],
@empTxt [varchar](50),
@empDate [datetime])
AS INSERT INTO [orderEmp]
( [rownum], [empID], [empTxt], [empDate])
VALUES
( 1, @empID, @empTxt, @empDate)----“1“是一定要的但是不會影響ROWNUM列,只是為了
占用內存而已
下面是我的測試用例:
insert into orderemp(rownum,empid,emptxt,empdate)
values( 1, 173,'ddfdd',getdate())
insert into orderemp(rownum,empid,emptxt,empdate)
values( 1, 123,'ddfdd',getdate())
insert into orderemp(rownum,empid,emptxt,empdate)
values( 1, 163,'ddfdd',getdate())
insert into orderemp(rownum,empid,emptxt,empdate)
values( 1, 153,'ddfdd',getdate())
insert into orderemp(rownum,empid,emptxt,empdate)
values( 1, 143,'ddfdd',getdate())
select * from orderemp order by rownum
delete from orderemp where empid>150 and empid<170
select * from orderemp order by rownum
至于更新的語句嗎
只要不更新ROWNUM列,就不用處理了
注:一定要把數據庫的:服務器設置--->服務器行為--->第二個選項不要選中