2011-05-08 98 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