我有 2 个存储过程:
CREATE PROCEDURE `GetEntryCount`(param_Criteria VARCHAR(500))
BEGIN
IF (param_CRITERIA <> "") THEN
SET @QUERY1 = concat('SELECT user_name,count(*) as count
FROM foodmaster d inner join user_details u
on d.user_id=u.user_id WHERE (', param_CRITERIA ,') group by u.user_id;');
PREPARE stmt FROM @QUERY1;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
CREATE PROCEDURE `sample`(param_CRITERIA VARCHAR(500))
BEGIN
SELECT user_name,count(*) as count FROM foodmaster d
inner join user_details u on d.user_id=u.user_id
WHERE ( param_CRITERIA ) group by u.user_id;
END;
我尝试在两个 SP 中使用相同的 param_criteria。在第一个过程中,我得到了结果。但不是第二。为什么?
因为巧合的是,第二个在语法上是有效的,但不是做你正在做的事情的正确方法。您正在尝试在不使用动态 sql 的情况下执行动态 sql。您在 #2 中所做的实际上是将文字字符串 ', param_CRITERIA ,' 放在 where 子句中,而不是该变量的内容。
做你想做的事情的唯一方法是方法#1。
我还要指出,如果您在方法 #1 中传递的值来自不可靠的来源(例如 Web 表单或 url url 查询字符串),那么您也可能为 SQL 注入漏洞做好准备。
编辑:
您已经更新了您的问题,因此示例编号 2 不再与我上面的答案一致,因此为了将来清楚起见,我将指出您的原始查询 #2 如下所示:
现在您已经删除了逗号和引号:
这也不起作用,因为正如我所指出的,您正在尝试将变量的内容插入到查询的主体中,从而模糊了逻辑和数据之间的界限。做到这一点的唯一方法是制作一个动态 SQL 查询,这就是您在 #1 中所做的。Example #2 不是一个动态查询,不能成为一个。