在儲存過程中如何實現將id列表字串傳入in()

2022-02-06 11:38:40 字數 1064 閱讀 7965

我們在平常編寫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...