Eu tenho 2 procedimentos armazenados:
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;
Eu tentei com o mesmo param_criteria em ambos os SPs. No primeiro procedimento, estou obtendo resultados. Mas não em segundo. Por quê?
Porque o segundo é, coincidentemente, sintaticamente válido, mas não é a maneira correta de fazer o que você está fazendo. Você está tentando fazer sql dinâmico sem usar sql dinâmico. O que você está fazendo em #2 é, na verdade, colocar a string literal ', param_CRITERIA ,' na cláusula where, não o conteúdo dessa variável.
A única maneira de fazer o que você está tentando fazer é o método #1.
Também gostaria de apontar que, se o valor que você está passando no método nº 1 vier de uma fonte não confiável (como um formulário da Web ou url url query string), você também está se preparando para uma vulnerabilidade de injeção de SQL.
Editar:
Você atualizou sua pergunta para que o exemplo número 2 não seja mais consistente com minha resposta, acima, portanto, para clareza futura, apontarei que sua consulta original nº 2 era assim:
Agora você removeu as vírgulas e as aspas:
Isso também não funciona porque, como indiquei, você está tentando obter o conteúdo de uma variável interpolada no corpo da consulta, borrando a fronteira entre lógica e dados. A única maneira de fazer isso é criar uma consulta SQL dinâmica, que é o que você está fazendo em #1. O exemplo nº 2 não é uma consulta dinâmica e não pode ser transformada em uma.