我将参数传递为“Suburbun”,“Indigo”以检索与MySql中创建的以下存储过程中的两个广告系列匹配的记录。
CREATE PROCEDURE `DemoSP`(Campaign VARCHAR(3000))
BEGIN
SET @query = CONCAT('Select * from vicidial_log WHERE campaign_id IN (?)');
PREPARE stmt FROM @query;
SET @CampaignID = Campaign;
EXECUTE stmt USING @CampaignID;
DEALLOCATE PREPARE stmt;
END;
它没有任何行!
但是当我在SP中仅通过“Suburbun”时,它会产生6行!
我哪里错了?
- 回答!
我尝试了Lee Fentress在http://www.poolofthought.com/index.php/2008/12/28/a-comma-seperated-list-as-parameter-to-mysql-stored-procedure/中的评论,并且peterm的答案反映了类似的编码,
有效!
谢谢,但与SQL Server相比,我发现这个负面标记。
哎呀,谢谢你们!
答案 0 :(得分:0)
试试这个:
无需使用PREPARE STATEMENT
。您可以使用FIND_IN_SET()
函数
SELECT * FROM vicidial_log WHERE FIND_IN_SET(campaign_id, Campaign)
答案 1 :(得分:0)
在这种情况下,您将无法使用USING
。您可以构建完整的查询sting并在不使用参数的情况下执行它
DELIMITER $$
CREATE PROCEDURE DemoSP(Campaign VARCHAR(3000))
BEGIN
SET @query = CONCAT('SELECT * FROM vicidial_log WHERE campaign_id IN (', Campaign, ')');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
注意:确保您在Campaign
中传递的分隔值已正确引用(如您所说),并且值中的引号(如果有)将被转义。< / p>
这是 SQLFiddle 演示
答案 2 :(得分:-1)
试试这个
"Select * from vicidial_log WHERE campaign_id IN ('?')"
而不是
'Select * from vicidial_log WHERE campaign_id IN (?)'