MS SQL選擇固定區間條數方法

          樓主wzg1976(吃了嗎?)2004-01-06 11:19:05 在 MS-SQL Server / 基礎類 提問

          比如,我查詢的條件能返回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

          posted on 2007-01-23 16:19 Tom 閱讀(1379) 評論(0)  編輯  收藏 所屬分類: DB

          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類(42)

          隨筆檔案(43)

          文章分類

          相冊

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 松滋市| 开封市| 宜都市| 大冶市| 正定县| 邹城市| 铜梁县| 桂平市| 通江县| 大化| 西安市| 汉中市| 宜丰县| 三明市| 罗平县| 邵武市| 镇康县| 宁阳县| 榆林市| 高邮市| 奎屯市| 汉川市| 措勤县| 平乡县| 华蓥市| 华亭县| 南通市| 太湖县| 扶风县| 渭源县| 二连浩特市| 麦盖提县| 宣武区| 五河县| 若尔盖县| 红安县| 通山县| 新干县| 凤台县| 额济纳旗| 兴和县|