Where 子句在存储过程之外工作时不起作用

Where clause not working in stored procedure, when working outside of it

我们构建了一个动态 sql 片段,可以从长格式数据生成宽视图。看到这里:

CREATE PROCEDURE `selectPivotedTermpoints`(studyid varchar(300))
BEGIN

SET SESSION group_concat_max_len = 10000000;
SET @psql = NULL;
SET @finalSQL = NULL;
SET @StudyID = studyid;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT('SUM(CASE WHEN terminate = ''', REPLACE(Terminate,'''', ''''''), ''' THEN 1 ELSE 0 END) AS `', REPLACE(Terminate,'''', ''), '`')
  ) INTO @psql
FROM Dashboard
WHERE studyid = @StudyID
  AND completion_status = 'terminate';

SET @finalSQL = CONCAT('
SELECT Sample_provider as Provider,
       completion_status as `Status`,',
       @psql,'
FROM   Dashboard
WHERE studyid = ''', @StudyID, '''
  AND completion_status = ''terminate''
GROUP  BY Sample_provider');

SELECT @finalSQL;
PREPARE stmt FROM @finalSQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END

当 sql 是 运行 作为查询时,(从 SET 到 DEALLOCATE)手动设置 @StudyID,我们 return 一个 table 只有列该特定研究(不同的 Terminate as columns for only that study),但是当查询转换为存储过程并且 运行 它正在生成一个 table,其中包含所有研究的列(所有不同的 Terminate as columns ).

当 运行 作为存储过程时,第一个 where 子句(在 select group_concat 中)似乎被忽略了,但当 [=29 时情况并非如此=] 作为一个简单的查询。

存储过程调用:

selectPivotedTermpoints('bhp_03a');

有谁知道为什么会这样和/或我该如何解决这个问题?

我最近在另一个问题中帮助了一个有类似问题的人;这让我们困惑了很长一段时间。将参数名称更改为其他名称,我猜测 WHERE 正在使用它而不是 table 中的字段。

(您也可以使用 Dashboard.studyid,但更改参数名称会减少混淆;而且我不确定 @finalSQL 中的查询的行为方式要么。)