我正在尝试执行存储过程中包含的以下查询语句 - 所有P ...都是SP的参数(ex PInitialDateFrom)。
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。
有人能说出这个查询有什么问题吗?
答案 0 :(得分:2)
您无法使用此部分:
and ProductId in (?)
请记住:SQL参数与C
宏不同,您只是在进行字符串替换。它们不仅仅是:当您使用?
时,会绑定一个且仅有一个参数。因此,当您尝试将1,2,3
绑定到该参数时,它不像您尝试绑定三个值而只是一个值。
如果您的列表大小固定,您可以使用:
and ProductId in (?,?,?)
否则,我认为你不能使用该子句的参数。也许做类似的事情:
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
的输入,这样就不会在代码中添加SQLInjection漏洞。
答案 1 :(得分:0)
你应该这样说:
and ProductID = (?)
我希望它有效。