動態SQL語句傳參問題總結一

2021-05-23 00:59:27 字數 2469 閱讀 8045

在呼叫分頁儲存過程的時候往往會遇到引數被當做字元傳遞,而沒被賦值的情況:

例入:有如下分頁儲存過程

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.避...