線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:893
推到 Plurk!
推到 Facebook!

請教關於預存程序的select in問題

答題得分者是:timhuang
demo
一般會員


發表:14
回覆:14
積分:5
註冊:2003-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-18 10:33:16 IP:218.163.xxx.xxx 未訂閱
各位大大您好: 在sql server上寫了一隻預存程序, 功用是在把傳入的參數(例如:'item1,item2'), 轉成sql語法中 in ( 'item1','item2') 然後再把格式轉好的變數下到sql上, 問題來了,為什麼我在下 select * from table where field1 in (@temp) 時,sql都沒有撈到資料呢? 以下是我的預存程序內容: CREATE PROCEDURE DoAction @conin varchar(1024) AS print @conin -->值為item1,item2 DECLARE @temp varchar(1024) select @temp = '' --拆解成 in (item)的語法 @temp為拆解完成值 while len(@conin)>0 begin if CHARINDEX(',', @conin) >0 begin select @temp = @temp '''' SUBSTRING(@conin, 1, CHARINDEX(',', @conin)-1) '''' ',' select @conin = SUBSTRING(@conin,CHARINDEX(',', @conin) 1,len(@conin)-CHARINDEX(',', @conin) ) end else begin select @temp = @temp '''' SUBSTRING(@conin,1,len(@conin)) '''' select @conin = '' end end select @temp print @temp -->我正常print出來的值是對的,'item1','item2' Select * from table where (field1 IN ('item1','item2')) -->這樣run出來能抓得到值 Select * from table where (field1 IN (@temp)) -->為什麼這樣就撈不到資料呢? 希望各位大大能幫個忙,找好多天都找不到怎麼解這個問題 謝謝您
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-18 12:02:27 IP:203.95.xxx.xxx 未訂閱
Hi, 這是因為 in (@item) 語法並非是 cmd , 而資料庫將其當成一項而已, 所以你稍加修改即可, 如, 前面多個 declare @cmd nvarchar(2000) 後面改為 set @cmd = 'Select * from table where (field1 IN (' +@temp+'))' exec sp_executesql @cmd 用組合指令的方式來執行即可!
demo
一般會員


發表:14
回覆:14
積分:5
註冊:2003-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-18 13:27:18 IP:218.163.xxx.xxx 未訂閱
真是太謝謝您了,可以了耶!呵 可以再請教您一下嗎? 我預存程序後面又多加了用cursor去針對每一筆撈到的資料作處理 預存程序如下:  declare concursor cursor for Select Field2 from table1 where (field1 IN (@temp))  open concursor  fetch concursor into @field2  while @@fetch_status=0   begin   -->我要處理的事    fetch next from concursor into  @itemobjid  end  close concursor    deallocate concursor 這樣,我如果把  declare concursor cursor for Select Field2 from table1 where (field1 IN (@temp)) 改為您教我的方式,這樣會有  declare concursor cursor for @cmd 這樣的話要怎麼解呢?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-18 14:43:17 IP:203.95.xxx.xxx 未訂閱
一樣地, 若是要在 cursor 中的 select_statement 為自組參數時, 就得將整個 cursor 在自組指令中執行, 如,    
set @cmd = 
'
declare @itemobjid varchar(100)
declare concursor cursor for Select Field2 from table1 where (field1 IN ('+@temp+'))
open concursor
fetch concursor into @field2
while @@fetch_status=0 
begin
-->我要處理的事
fetch next from concursor into @itemobjid
end
close concursor 
deallocate concursor
'    exec sp_executesql @cmd
要注意的是在該 @cmd scope 中的變數是和外界不通的, 必須自行再次宣告哦!
系統時間:2024-07-02 0:17:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!