oracle|分頁|資料|資料庫
在以資料庫為基礎的應用程式開發中,分頁是一個比較常用的操作,
可惜的是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
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列,就不用處理了