當前位置:首頁 » 編程語言 » sql寫分頁查詢返回總數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql寫分頁查詢返回總數

發布時間: 2022-09-10 08:28:58

1. 如何通過執行動態sql獲取分頁需要的總記錄數

�衷詰奈侍餼凸榻嵩謖餉窗鴉袢∽薌鍬擠禱氐醬媧⒐�痰氖涑霾問�小O衷詡虻ヌ�隹突П斫峁梗� 接著貼出我的存儲過程: Create proc [dbo].[Get_Customer] @type varchar(1000), @pageIndex int, @pageSize int, @RecordCount int outputasdeclare @beginIndex int declare @endIndex int declare @sql Nvarchar(max)注意這里定義的是Unicode變數 set @beginIndex=(@pageIndex-1)*@pageSize+1 set @endIndex=@pageIndex*@pageSize set @sql=' IF OBJECT_ID(''tempdb..#temp'') IS NOT NULL DROP TABLE #temp select ROW_NUMBER() over (order by c.Id) as id,CustomNO,Name,Phone,Email,Type into #temp from Customer ' if(@type is not null) set @sql=@sql+'where type='''+@type+'' set @sql=@sql+' select @p=COUNT(*) from #temp select * from #temp where #temp.rowNum between ' + cast(@beginIndex as varchar(10))+' and '+ cast(@endIndex as varchar(10)) --使用EXECUTE直接執行獲取不到總記錄數 --EXECUTE (@sql) --使用EXECUTE執行sp_executesql存儲過程才能獲取到EXECUTE sp_executesql @sql,N'@p AS INT OUTPUT',@p=@RecordCount Output 其實以上兩種執行的方式差別就是:一種是執行一個動態的批處理,另一種是執行一個存儲過程 sp_executesql命令,因為它提供一個介面,該介面及支持輸入參數也支持輸出參數。這功能使你可以創建帶參數的查詢字元串,這樣就可以比EXEC更好的重用執行計劃,sp_executesql的構成與存儲過程非常相似,不同之處在於你是動態構建代碼。通過上面的列子的話可以看見直接執行批處理時獲取不到動態語句裡面的總記錄數的。 構造動態sql的where子句,也就是條件子句時,exec無法使用變數來進行佔位,需要將變數轉換成字元串,然後和動態sql進行拼接,這就可能引起Sql注入問題,而通過sp_executesql就不會有這個問題 比如上面的存儲過程可以按一下方式修改執行修改一: set @sql=@sql+'where type='''+@type+''改為: set @sql=@sql+'where type=@typ' 修改二 --使用EXECUTE執行sp_executesql存儲過程才能獲取到 EXECUTE sp_executesql @sql,N'@p AS INT OUTPUT',@p=@RecordCount Output 改為 --使用EXECUTE執行sp_executesql存儲過程才能獲取到 EXECUTE sp_executesql @sql,N'@typ Nvarchar(50),@p AS INT OUTPUT',@typ=@type @p=@RecordCount Output 至於sp_executesql更詳細的語法及使用方式請參考其它資料,或者直接打開資料庫然後按F1尋求幫助 嘿嘿!! ,本站保留追究責任的權利。

2. 如何在Sql Server上使用一條SQL查詢結果總數並且分頁

using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;

namespace CountTest
{
class Program
{
static string conStr = "Persist Security Info=False;Integrated Security=true;Initial Catalog=TSQLFundamentals2008;server=(local)";
static long nanosecPerTick = (1000L * 1000L * 1000L) / Stopwatch.Frequency;

static void Main(string[] args)
{
test1();

test2();
}

static void test1()
{
var t1 = Stopwatch.StartNew();
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
var comCount = new SqlCommand(@"select COUNT(*) from
(select emp.empid,SUM(od.unitprice*od.qty) money
from HR.Employees emp
left join Sales.Orders o on o.empid = emp.empid
left join Sales.OrderDetails od on od.orderid = o.orderid
group by emp.empid
) t", conn);
var count = comCount.ExecuteScalar();
var pageCount = new SqlCommand(@"select empid,money from
(select emp.empid,SUM(od.unitprice*od.qty) money,ROW_NUMBER() over(order by emp.empid) rm
from HR.Employees emp
left join Sales.Orders o on o.empid = emp.empid
left join Sales.OrderDetails od on od.orderid = o.orderid
group by emp.empid
) t where rm between 1 and 20", conn);
var dataAdapter = new SqlDataAdapter(pageCount);
dataAdapter.Fill(new DataTable());
}
t1.Stop();
Console.WriteLine("test1方法耗時:{0}納秒,{1}毫秒", t1.ElapsedTicks * nanosecPerTick, t1.ElapsedMilliseconds);
}

static void test2()
{
var t2 = Stopwatch.StartNew();
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();

var dTable = new DataTable();
var pageCount = new SqlCommand(@"select empid,money,a from
(select emp.empid,SUM(od.unitprice*od.qty) money,ROW_NUMBER() over(order by emp.empid) rm,COUNT(*) over() a
from HR.Employees emp
left join Sales.Orders o on o.empid = emp.empid
left join Sales.OrderDetails od on od.orderid = o.orderid
group by emp.empid
) t where rm between 1 and 20", conn);
var dataAdapter = new SqlDataAdapter(pageCount);
dataAdapter.Fill(dTable);
var count = dTable.Rows.Count > 0 ? dTable.Rows[0].ItemArray[dTable.Rows[0].ItemArray.Length - 1] : 0;
dTable.Columns.RemoveAt(dTable.Columns.Count - 1);
}
t2.Stop();
Console.WriteLine("test2方法耗時:{0}納秒,{1}毫秒", t2.ElapsedTicks * nanosecPerTick, t2.ElapsedMilliseconds);
}
}
}

3. mybatis註解配置文件中查詢分頁統計總記錄數sql語句怎麼寫

沒用過這種寫法,看你SQL的寫法,應該是mysql吧,那簡單咯啊,直接把分頁位置放到parameter這個map裡面去,然後在XML裡面寫<if test="offset != null and limit != null">limit #{offset},#{limit}</if> ,把這樣的放在where後面就行了啊,如果parameter這個map裡面根據key取到offset和limit,自然就會有分頁的哦!

4. 請問,如何用一條SQL查詢出分頁的數據和總記錄數啊MySQL的!不用存儲

的確要查詢兩次的,因為計算總記錄數是使用的聚合函數count(),如果你想一起查詢出來,就要使用分組,那樣也麻煩,對資料庫的操作要使用細粒度的操作,可以使用事務來控制兩次查詢,用同一個connection,這樣可以避免兩次查詢導致兩次不同進程之間的連接操作

5. SQL分頁查詢總記錄數和查詢信息臨時表

SQL分頁查詢總記錄數和查詢信息臨時表
創建臨時表
方法一:
create table #臨時表名(欄位1 約束條件,
欄位2 約束條件,
.....)
create table ##臨時表名(欄位1 約束條件,
欄位2 約束條件,
.....)
方法二:
select * into #臨時表名 from 你的表;
select * into ##臨時表名 from 你的表;
註:以上的#代表局部臨時表,##代表全局臨時表

查詢臨時表
select * from #臨時表名;
select * from ##臨時表名;

刪除臨時表
drop table #臨時表名;
drop table ##臨時表名;

6. SQL分頁的幾種方法

方法一 使用offset fetch next(2012版本及以上版本才可以使用)

方法二 使用row_number()函數
利用row_number() over(order by id desc)函數計算出行數,選定相應的行數返回即可(2005版本以上才可以使用)

使用存儲過程封裝

7. 一條sql語句實現分頁查詢,且能返回記錄總數

select *,(select count(*) from t1) from(
select top 2 * from(
select top 4 * from(
select * from t1
)as ttb0 order by id
)as ttb1 order by id desc
)as ttb2 order by id
在select後加個子查詢就OK了,

8. sql語句分頁查詢,如何同時返回記錄總條數

我只想到用子查詢 select top 10 *,(select count(1) from userTable )as 'count' from userTable但這樣總記錄會查10次我想要只查1次count(*) ,然後添加到記錄集的最後一列的第一行或者 能在sql語句中添加output參數嗎?我用的java回答: 你如果這樣寫sql語句的話,那麼,在你查詢出來的結果集中肯定會包含10個「count(1)」。 如果你只想出現一次「count(1)」的話,你就必須把「count(1)」單獨查詢出來,然後再用union和另一個記錄集進行合並。沒有辦法給你演示,只能這樣給你說了,不知道你看懂沒有????呵,,,,追問: 你的意思是添加到記錄集的最後一行嗎回答: 差不多就是這個意思,就是把它們兩者分別查詢出來,然後再用union進行聯合。

9. 面試題:sql 2005分頁查詢語句

我這里有一個存儲過程,很長很長啊。
--別看他很長,但是效率很高。5000萬條數據親測。
--不知道你用什麼變成語言。這里就不不寫調用方法了。
CREATE proc newgetpage
(--默認分頁主鍵為id
@tblName nvarchar(128), --表名稱列表
@PageSize int=10, --頁尺寸
@PageIndex int=1, --當前頁
@fields nvarchar(4000)='*', --查詢欄位列表
@fldname nvarchar(50), --主鍵欄位名
@fldorder bit=1, --主鍵排序方式,0asc,非零desc
@FirstfldName nvarchar(50)='', --主排序欄位名,非主鍵,有重復值
@FirstfldOrder bit=1, --主欄位排序方式
@SecondfldName nvarchar(50)='', --副排序欄位名,非主鍵,有重復值
@SecondfldOrder bit=1, --副欄位排序方式
@strWhere nvarchar(1000)='', --查詢條件
@Iscount bit=0 --返回記錄總數,非0則返回
)
as
declare @strsql nvarchar(4000) --主語句
declare @strtmp nvarchar(500) --臨時變數
declare @strorder nvarchar(500) --總排序方式
declare @stropporder nvarchar(500) --總排序的反方式
declare @strorderfldlist nvarchar(500) --所有要排序的欄位序列
declare @selectfld nvarchar(500) --選擇主鍵page
declare @selectfirst nvarchar(500) --選擇主排序page
declare @selectsecond nvarchar(500) --選擇副排序page
/**/
declare @strwheretmp nvarchar(500) --臨時where變數
if @strwhere!=''
set @strwheretmp=' where '
else
set @strwheretmp=''
/**/
set @strsql=''
set @strtmp=''
set @strorder=''
set @stropporder=''
set @strorderfldlist=''
set @selectfld=''
set @selectfirst=''
set @selectsecond=''
if @pagesize<1
set @pagesize=10
if @pageindex<1
set @pageindex=1
if @fields=''
set @fields='*'
if @FirstfldName=''
set @FirstfldName=''
if @SecondfldName=''
set @SecondfldName=''

--------------------------------bengin
----------總排序方式
if @fldorder!=0
begin
-----正排序
set @strorder=@fldname + ' desc '
if @secondfldname!=''
if @secondfldorder!=0
set @strorder=@secondfldname + ' desc,'+@strorder
else
set @strorder=@secondfldname + ' asc,'+@strorder
if @firstfldname!=''
if @firstfldorder!=0
set @strorder=@firstfldname + ' desc,'+@strorder
else
set @strorder=@firstfldname + ' asc,'+@strorder
-----反排序
set @stropporder=@fldname + ' asc '
if @secondfldname!=''
if @secondfldorder!=0
set @stropporder=@secondfldname + ' asc,'+@stropporder
else
set @stropporder=@secondfldname + ' desc,'+@stropporder
if @firstfldname!=''
if @firstfldorder!=0
set @stropporder=@firstfldname + ' asc,'+@stropporder
else
set @stropporder=@firstfldname + ' desc,'+@stropporder
end
else
begin
-----正排序
set @strorder=@fldname + ' asc '
if @secondfldname!=''
if @secondfldorder!=0
set @strorder=@secondfldname + ' desc,'+@strorder
else
set @strorder=@secondfldname + ' asc,'+@strorder
if @firstfldname!=''
if @firstfldorder!=0
set @strorder=@firstfldname + ' desc,'+@strorder
else
set @strorder=@firstfldname + ' asc,'+@strorder
-----反排序
set @stropporder=@fldname + ' desc '
if @secondfldname!=''
if @secondfldorder!=0
set @stropporder=@secondfldname + ' desc,'+@stropporder
else
set @stropporder=@secondfldname + ' asc,'+@stropporder
if @firstfldname!=''
if @firstfldorder!=0
set @stropporder=@firstfldname + ' desc,'+@stropporder
else
set @stropporder=@firstfldname + ' asc,'+@stropporder
end
set @stropporder=' order by '+@stropporder
set @strorder=' order by '+@strorder +' '
---------總排序方式end
---------總排序欄位序列
set @strorderfldlist='id'
if @firstfldname!=''
begin
set @strorderfldlist=@firstfldname+','+@strorderfldlist
if @secondfldname!=''
set @strorderfldlist=@secondfldname+','+@strorderfldlist
end
---------總排序欄位序列end
if @Firstfldname!=''
-------若主排序欄位不空,則按主排序欄位排序,
begin
if @fldorder!=0
set @strTmp = '<=(select top 1'
else
set @strTmp = '>=(select top 1'
set @selectfld=@fldname + replace(@strtmp,'=','')+'('+@fldname+')from(select top ' + str((@PageIndex-1)*@PageSize)
+ ' '+@strorderfldlist +' from '+@tblname+' '+@strwheretmp+@strwhere +@strorder
+')as tbltmp '+ @stropporder +')'
if @firstfldname!=''
set @selectfirst=' and '+@firstfldname + @strtmp+'('+@firstfldname+')from(select top ' + str((@PageIndex-1)*@PageSize)
+ ' '+@strorderfldlist +' from '+@tblname+' '+@strwheretmp+@strwhere +@strorder
+')as tbltmp '+ @stropporder +')'
if @secondfldname!=''
set @selectsecond=' and '+@secondfldname + @strtmp+'('+@secondfldname+')from(select top ' + str((@PageIndex-1)*@PageSize)
+ ' '+@strorderfldlist +' from '+@tblname+' '+@strwheretmp+@strwhere +@strorder
+')as tbltmp '+ @stropporder +')'
------------多欄位排序代碼

set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @selectfld + @selectfirst+ @selectsecond+ @strOrder

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @selectfld + @selectfirst+ @selectsecond+' and ' + @strWhere + ' ' + @strOrder

------------多欄位排序代碼end
end
-------若主排序欄位不空,則按主排序欄位排序,end
else
-------若主排序欄位為空,則按主鍵排序,
begin
if charindex('.',@fldname)>0
set @selectfld=substring(@fldname,charindex('.',@fldname)+1,len(@fldname))
else
set @selectfld=@fldname
if @fldorder!=0
begin
set @strTmp = '<(select top 1'
set @strOrder = ' order by ' + @fldName +' desc'
set @stropporder=' order by '+@selectfld +' asc'
end
else
begin
set @strTmp = '>(select top 1'
set @strOrder = ' order by ' + @fldName +' asc'
set @stropporder=' order by '+@selectfld +' desc '
end

set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ @selectfld + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp '+@stropporder +')'
+ @strOrder

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ @selectfld + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp '+@stropporder +') and ' + @strWhere + ' ' + @strOrder
end
-------若主排序欄位為空,則按主鍵排序,end
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere

set @strSQL = 'select top ' + str(@PageSize) + ' '+@fields+' from '
+ @tblName + '' + @strTmp + ' ' + @strOrder
end

if @IsCount != 0
begin
set @strSQL = 'select count(*) as Total from ' + @tblName + ''
if @strWhere!=''
set @strSQL='select count(*) as Total from '+@tblName +' where ' +@strWhere
end
--print @strsql
exec (@strSQL)
GO