国产探花免费观看_亚洲丰满少妇自慰呻吟_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列,就不用處理了

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 奉新县| 建始县| 永安市| 绥滨县| 化州市| 绥芬河市| 盐山县| 仙游县| 宜良县| 区。| 屏边| 扶风县| 香格里拉县| 木兰县| 集贤县| 比如县| 沅陵县| 南和县| 怀集县| 丰宁| 酉阳| 武清区| 休宁县| 邹城市| 小金县| 五华县| 泸水县| 萨迦县| 宁国市| 儋州市| 阜宁县| 阿城市| 紫阳县| 鸡泽县| 陕西省| 霍林郭勒市| 平塘县| 绥德县| 太仆寺旗| 垦利县| 光山县|