在呼叫分頁儲存過程的時候往往會遇到引數被當做字元傳遞,而沒被賦值的情況:
例入:有如下分頁儲存過程
create procedure [dbo].[pagechange_sp]
(@tablename varchar(max), --表名
@refieldsstr varchar(max) = '*', --欄位名(全部欄位為*)
@orderstring varchar(max), --排序字段(必須!支援多欄位不用加order by)
@wherestring varchar(max) =n'', --條件語句(不用加where)
@pagesize int, --每頁多少條記錄
@pageindex int = 1 , --指定當前為第幾頁
@totalrecord int output --返回總記錄數)as
begin
--處理開始點和結束點
declare @startrecord int;
declare @endrecord int;
declare @totalcountsql nvarchar(max);
declare @sqlstring nvarchar(max);
set @startrecord = (@pageindex-1)*@pagesize + 1
set @endrecord = @startrecord + @pagesize - 1
set @totalcountsql= n'select @totalrecord = count(1) from ' + @tablename;--總記錄數語句
set @sqlstring = n'(select row_number() over (order by '+ @orderstring +') as rowid,'+@refieldsstr+' from '+ @tablename;--查詢語句
--if (@wherestring! = '' or @wherestring!=null)
begin
set @totalcountsql=@totalcountsql + ' where '+ @wherestring;
set @sqlstring =@sqlstring+ ' where '+ @wherestring;
end--第一次執行得到
--if(@totalrecord is null)
-- begin
exec sp_executesql @totalcountsql,n'@totalrecord int out',@totalrecord output;--返回總記錄數
-- end
----執行主語句
set @sqlstring ='select * from ' + @sqlstring + ') as t where rowid between ' + ltrim(str(@startrecord)) + ' and ' + ltrim(str(@endrecord));
exec(@sqlstring)
end在另外乙個儲存工程中呼叫該儲存過程傳遞引數!
錯誤的方式:
create proc getuserinfo(@userid int,@usertype int,@pagesize int,@pageindex int)
asbegin
declare @totalrecord int
declare @strwhere nvarchar(max)
set @strwhere='userid=@userid and usertype =@usertype '
exec pagechange_sp user_tb,'*',userid desc',@strwhere,@ppagesize,@ppageindex,@totalrecord out
end上面這種傳遞引數的方式會導致 @userid @usertype 直接傳到分頁儲存過程,而在分頁儲存過程中沒有@userid和@usertype而報錯。。
解決方法如下:
create proc getuserinfo(@userid int,@usertype int,@pagesize int,@pageindex int)
asbegin
declare @totalrecord int
declare @strwhere nvarchar(max)
set @strwhere='userid='ltrim(@userid)+' and usertype ='+ltrim(@usertype)'
exec pagechange_sp user_tb,'*',userid desc',@strwhere,@ppagesize,@ppageindex,@totalrecord out
end
關於儲存過程中SQL語句IN條件傳參注意說
在資料庫操作中我們經常會用到查詢語句,在一些情況下,需要使用到in條件,正常的查詢中in需要注意的是最好in中的引數不能超過1000個,超過1000的時候oracle會丟擲異常。這個如何處理先不提,這次要說的是,如果在儲存過程中使用到了in條件,而引數是由外部傳進來的情況下,需要注意一下傳參的處理方...
MySQL基礎sql語句總結(一)
mysql資料庫基礎知識點總結 一 資料庫 儲存有組織的資料的容器 主鍵 primary key 一一列 或一組列 其值能夠唯一區分表 中每個行。主鍵的最好習慣 除mysql強制實施的規則外,應該堅持的 幾個普遍認可的最好習慣為 不更新主鍵列中的值 不重用主鍵列的值 不在主鍵列中使用可能會更改的值。...
SQL語句效率問題的幾點總結
1.sql優化的原則是 將一次操作需要讀取的block數減到最低,即在最短的時間達到最大的資料吞吐量。調整不良sql通常可以從以下幾點切入 檢查不良的sql,考慮其寫法是否還有可優化內容 檢查子查詢 考慮sql子查詢是否可以用簡單連線的方式進行重新書寫 檢查優化索引的使用 考慮資料庫的優化器 2.避...