我們在平常編寫sql語句時,經常碰到要把id列表字串(比如:'001,002,003,....')當做引數傳遞給儲存過程,
那麼在儲存過程中要用in作為條件進行記錄的過濾,那麼採用in(@idlist),其中@idlist如'001,002,003,....'。這樣執行儲存過程就會出錯,顯然這種傳遞方法是不可行的(除非@idlist只有乙個id如'001'),
今天晚上和導師嘗試了很多中辦法,還是沒解決。在不斷的討論中,突然有個靈感:就是採用臨時表,
把這些id乙個乙個存在臨時表中(這個需要點技巧,後面給出**),然後這樣呼叫in:in(select id from #tbidlist)
,其中#tbidlist 為儲存了id的臨時表。
create table #tbuserid(userid int)
declare @userid varchar(20)
while(charindex(',',@key) >0)
begin
set @userid = substring(@key,0,charindex(',',@key))
set @key = substring(@key,charindex(',',@key)+1,len(@key))
insert into #tbuserid(userid) values(@userid)
endinsert into #tbuserid(userid) values(@key)
例子:@key='0001,0002,0003'
呼叫:select * from tbuser where userid in (select userid from #tbuserid)
後來有同事問我效率怎樣?
我去查了一下in的效率,發現建議使用exists不使用in,而上面的語句系統會自動轉換為
exists(select * from #tbuserid where tbuser.userid = userid),所以效率是沒問題的。
可是如果in後面查詢語句涉及到多個條件且和外表相關時此時採用exists效率更好。
詳情見我的**的文章:
在儲存過程中實現事務
在圖書館管理系統中系統管理員可以進行的操作有 借 還 新增 刪除 修改圖書或新增 刪除 修改讀者等,很多的操作都涉及到多個表的進行,我們一定要保持資料的一致性。如 刪除讀者 操作,會在讀者表 reader 中進行讀者的刪除,該讀者刪除後,借書表 reader book 也沒有必要再保留該讀者的借書記...
動態sql在儲存過程中的實現
這種情況下,如何轉為儲存過程呢?以上面的兩個動態為例,在儲存過程中實現如下 create or replace procedure my procedure1 tablename in varchar2,studentname in varchar2,my cursor1 out my proced...
Oracle在儲存過程中如何返回結果集
oracle和sqlserver不一樣的地方有很多。個人最深的體會是儲存過程返回結果集,在sqlserver中直接select查詢就行,oracle就不行了。這裡,就用最簡單的例子說明儲存過程返回結果集的例子 create orreplace procedure 儲存過程名 欄位名 invarcha...