国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

為數據庫的表自動生成行號----為分頁打好基礎(仿Oracle的ROWNUM)

2024-08-29 13:45:02
字體:
來源:轉載
供稿:網友

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

注:一定要把數據庫的:服務器設置--->服務器行為--->第二個選項不要選中

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大港区| 修武县| 武穴市| 霞浦县| 洛浦县| 穆棱市| 若羌县| 大厂| 布拖县| 承德市| 正阳县| 屏东市| 洪雅县| 达拉特旗| 沁阳市| 东城区| 罗城| 平利县| 昆明市| 开江县| 临武县| 红桥区| 舞阳县| 赤峰市| 五常市| 岳普湖县| 文昌市| 浏阳市| 集安市| 临高县| 五台县| 繁昌县| 台前县| 射阳县| 许昌市| 霸州市| 岳阳县| 蓬溪县| 乌拉特中旗| 台南县| 保定市|