為資料庫的表自動產生行號----為分頁打好基礎(仿Oracle的ROWNUM)

來源:互聯網
上載者:User
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

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列,就不用處理了

註:一定要把資料庫的:伺服器設定--->伺服器行為--->第二個選項不要選中


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。