2011-05-08 51 views
2

我試圖執行包含在存儲過程中下面的查詢語句幫助 - 凡均P ...是參數SP(前PInitialDateFrom)。需要與MySQL查詢

SET @stmt_text = CONCAT('SELECT AccountID, Firstname as ClientName, EmailID 
       , ProductID, InitialPurchaseDate as Purchasedate 
       FROM client_account 
       WHERE IsRemoved = 0 
       AND (InitialPurchasedate between ? and ?) 
       AND ProductId IN (?)'); 

PREPARE stmt FROM @stmt_text; 

SET @initDt1=PInitialDateFrom, @initDt2 = PInitialDateTo, @inlist=PIDs 
    , @stmt_text = null; 

EXECUTE stmt USING @initDt1, @initDt2, @inlist; 

DEALLOCATE PREPARE stmt; 

我傳遞PID的作爲ID的串像1,2,3 當我嘗試執行語句,只有第一個ID被考慮。例如。 1,2,3僅被使用1被採用,如果3,2,1被使用則僅被採用3。

誰能告訴什麼錯此查詢?

回答

2

不能使用這部分:

and ProductId in (?) 

記住:SQL參數不喜歡C宏,你只是在做字符串替換。它們超過泰爾:當你使用?,時,只有一個參數被綁定。因此,當您嘗試將1,2,3綁定到該參數時,它不會像您試圖綁定三個值而只有一個值。

如果你的清單將是固定大小的,你可以使用:

and ProductId in (?,?,?) 

否則,我不認爲你將能夠使用參數that從句。也許做類似:

set @initDt1=PInitialDateFrom, 
    @initDt2 = PInitialDateTo, 
    @inlist=PIDs, 
    @stmt_text = null; 
set @stmt_text = 
    concat('Select AccountID, Firstname as ClientName, EmailID, ProductID 
    , InitialPurchaseDate as Purchasedate from client_account 
    where IsRemoved=0 and (InitialPurchasedate between ? and ?) 
    and ProductId in (', @inlist, ')'); 
prepare stmt from @stmt_text; 
execute stmt using @initDt1, @initDt2; 
deallocate prepare stmt; 

確保你淨化你的PIDs輸入,所以你不SQL注入攻擊漏洞添加到您的代碼。

+0

謝謝巴勃羅。有沒有其他方式像分割字符串到數組中? – IrfanRaza 2011-05-08 12:10:25

+2

試着按照我在最後一個例子中給你看的方式去做。不要將您的列表用作查詢的參數,而要將其連接到原始字符串中。確保您對輸入進行了清理,以免您將SQL注入漏洞添加到您的代碼中。 – 2011-05-08 12:16:06

+0

再次謝謝帕布羅。它的工作。 – IrfanRaza 2011-05-08 12:22:49

0

你應該把這樣的:

and ProductID = (?) 

我希望它的作品。

+0

謝謝,但它不工作。而我的東西=不會工作,因爲我需要從一個組中取值。 – IrfanRaza 2011-05-08 12:13:21