比如,我查詢的條件能返回100條記錄,而我只要取得其中的第50~第60條, ?
? ? ? 請問如何處理? 問題點數:20、回復次數:4Top
1 樓zjcxc(鄒建)
回復于 2004-01-06 11:28:38 得分 20
查詢第X頁,每頁Y條記錄 ?
? ?
? 最基本的處理方法: ?
? ?
? 如果表中有主鍵(記錄不重復的字段也可以),可以用類似下面的方法,當然x,y要換成具體的數字,不能用變量: ?
? ?
? select ? top ? y ? * ? from ? 表 ? where ? 主鍵 ? not ? in(select ? top ? (x-1)*y ? 主鍵 ? from ? 表) ?
? ?
? ?
? ?
? 如果表中無主鍵,可以用臨時表,加標識字段解決.這里的x,y可以用變量. ?
? ?
? select ? id=identity(int,1,1),* ? ? into ? #tb ? from ? 表 ?
? select ? * ? from ? #tb ? where ? id ? between ? (x-1)*y ? and ? x*y-1 ?
? ?
? Top
2 樓zjcxc(鄒建)
回復于 2004-01-06 11:28:52 得分 0
/*--用存儲過程實現的分頁程序 ?
? ?
? 顯示指定表、視圖、查詢結果的第X頁 ?
? 對于表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法 ?
? 如果視圖或查詢結果中有主鍵,不推薦此方法 ?
? 如果使用查詢語句,而且查詢語句使用了order ? by,則查詢語句必須包含top ? 語句 ?
? ?
? --鄒建 ? 2003.09--*/ ?
? ?
? /*--調用示例 ?
? exec ? p_show ? '地區資料' ?
? ?
? exec ? p_show ? 'select ? top ? 100 ? percent ? * ? from ? 地區資料 ? order ? by ? 地區名稱',5,3,'地區編號,地區名稱,助記碼' ?
? --*/ ?
? ?
? if ? exists ? (select ? * ? from ? dbo.sysobjects ? where ? id ? = ? object_id(N'[dbo].[p_show]') ? and ? OBJECTPROPERTY(id, ? N'IsProcedure') ? = ? 1) ?
? drop ? procedure ? [dbo].[p_show] ?
? GO ?
? ?
? CREATE ? Proc ? p_show ?
? @QueryStr ? nvarchar(4000), --表名、視圖名、查詢語句 ?
? @PageSize ? int=10, --每頁的大小(行數) ?
? @PageCurrent ? int=1, --要顯示的頁 ?
? @FdShow ? nvarchar ? (4000)='', --要顯示的字段列表,如果查詢結果有標識字段,需要指定此值,且不包含標識字段 ?
? @FdOrder ? nvarchar ? (1000)='' --排序字段列表 ?
? as ?
? declare ? @FdName ? nvarchar(250) --表中的主鍵或表、臨時表中的標識列名 ?
? ,@Id1 ? varchar(20),@Id2 ? varchar(20) --開始和結束的記錄號 ?
? ,@Obj_ID ? int --對象ID ?
? --表中有復合主鍵的處理 ?
? declare ? @strfd ? nvarchar(2000) --復合主鍵列表 ?
? ,@strjoin ? nvarchar(4000) --連接字段 ?
? ,@strwhere ? nvarchar(2000) --查詢條件 ?
? ?
? ?
? select ? @Obj_ID=object_id(@QueryStr) ?
? ,@FdShow=case ? isnull(@FdShow,'') ? when ? '' ? then ? ' ? *' ? else ? ' ? '+@FdShow ? end ?
? ,@FdOrder=case ? isnull(@FdOrder,'') ? when ? '' ? then ? '' ? else ? ' ? order ? by ? '+@FdOrder ? end ?
? ,@QueryStr=case ? when ? @Obj_ID ? is ? not ? null ? then ? ' ? '+@QueryStr ? else ? ' ? ('+@QueryStr+') ? a' ? end ?
? ?
? --如果顯示第一頁,可以直接用top來完成 ?
? if ? @PageCurrent=1 ?
? begin ?
? select ? @Id1=cast(@PageSize ? as ? varchar(20)) ?
? exec('select ? top ? '+@Id1+@FdShow+' ? from ? '+@QueryStr+@FdOrder) ?
? return ?
? end ?
? ?
? --如果是表,則檢查表中是否有標識更或主鍵 ?
? if ? @Obj_ID ? is ? not ? null ? and ? objectproperty(@Obj_ID,'IsTable')=1 ?
? begin ?
? select ? @Id1=cast(@PageSize ? as ? varchar(20)) ?
? ,@Id2=cast((@PageCurrent-1)*@PageSize ? as ? varchar(20)) ?
? ?
? select ? @FdName=name ? from ? syscolumns ? where ? id=@Obj_ID ? and ? status=0x80 ?
? if ? @@rowcount=0 --如果表中無標識列,則檢查表中是否有主鍵 ?
? begin ?
? if ? not ? exists(select ? 1 ? from ? sysobjects ? where ? parent_obj=@Obj_ID ? and ? xtype='PK') ?
? goto ? lbusetemp --如果表中無主鍵,則用臨時表處理 ?
? ?
? select ? @FdName=name ? from ? syscolumns ? where ? id=@Obj_ID ? and ? colid ? in( ?
? select ? colid ? from ? sysindexkeys ? where ? @Obj_ID=id ? and ? indid ? in( ?
? select ? indid ? from ? sysindexes ? where ? @Obj_ID=id ? and ? name ? in( ?
? select ? name ? from ? sysobjects ? where ? xtype='PK' ? and ? parent_obj=@Obj_ID ?
? ))) ?
? if ? @@rowcount>1 --檢查表中的主鍵是否為復合主鍵 ?
? begin ?
? select ? @strfd='',@strjoin='',@strwhere='' ?
? select ? @strfd=@strfd+',['+name+']' ?
? ,@strjoin=@strjoin+' ? and ? a.['+name+']=b.['+name+']' ?
? ,@strwhere=@strwhere+' ? and ? b.['+name+'] ? is ? null' ?
? from ? syscolumns ? where ? id=@Obj_ID ? and ? colid ? in( ?
? select ? colid ? from ? sysindexkeys ? where ? @Obj_ID=id ? and ? indid ? in( ?
? select ? indid ? from ? sysindexes ? where ? @Obj_ID=id ? and ? name ? in( ?
? select ? name ? from ? sysobjects ? where ? xtype='PK' ? and ? parent_obj=@Obj_ID ?
? ))) ?
? select ? @strfd=substring(@strfd,2,2000) ?
? ,@strjoin=substring(@strjoin,5,4000) ?
? ,@strwhere=substring(@strwhere,5,4000) ?
? goto ? lbusepk ?
? end ?
? end ?
? end ?
? else ?
? goto ? lbusetemp ?
? ?
? /*--使用標識列或主鍵為單一字段的處理方法--*/ ?
? lbuseidentity: ?
? exec('select ? top ? '+@Id1+@FdShow+' ? from ? '+@QueryStr ?
? +' ? where ? '+@FdName+' ? not ? in(select ? top ? ' ?
? +@Id2+' ? '+@FdName+' ? from ? '+@QueryStr+@FdOrder ?
? +')'+@FdOrder ?
? ) ?
? return ?
? ?
? /*--表中有復合主鍵的處理方法--*/ ?
? lbusepk: ?
? exec('select ? '+@FdShow+' ? from(select ? top ? '+@Id1+' ? a.* ? from ?
? (select ? top ? 100 ? percent ? * ? from ? '+@QueryStr+@FdOrder+') ? a ?
? left ? join ? (select ? top ? '+@Id2+' ? '+@strfd+' ? ?
? from ? '+@QueryStr+@FdOrder+') ? b ? on ? '+@strjoin+' ?
? where ? '+@strwhere+') ? a' ?
? ) ?
? return ?
? ?
? /*--用臨時表處理的方法--*/ ?
? lbusetemp: ?
? select ? @FdName='[ID_'+cast(newid() ? as ? varchar(40))+']' ?
? ,@Id1=cast(@PageSize*(@PageCurrent-1) ? as ? varchar(20)) ?
? ,@Id2=cast(@PageSize*@PageCurrent-1 ? as ? varchar(20)) ?
? ?
? exec('select ? '+@FdName+'=identity(int,0,1),'+@FdShow+' ?
? into ? #tb ? from'+@QueryStr+@FdOrder+' ?
? select ? '+@FdShow+' ? from ? #tb ? where ? '+@FdName+' ? between ? ' ?
? +@Id1+' ? and ? '+@Id2 ?
? ) ?
? ?
? GO ?
? Top
3 樓erigido(豐田村農民)
回復于 2004-01-06 11:30:31 得分 0
收藏存儲過程先Top
4 樓sdhdy(大江東去...)
回復于 2004-01-06 11:32:26 得分 0
--表里沒有自增字段,才可以如下 ?
? select ? identity(int,1,1) ? FID,* ? into ? #temp ? from ? tablename ?
? go ?
? select ? * ? from ? #temp ? where ? FID ? between ? 50 ? and ? 60 ?
? go ?
? drop ? table ? #temp