Where子句在存储过程中不起作用,在其外部工作时

时间:2015-09-28 16:37:55

标签: mysql stored-procedures dynamic-sql

我们构建了一个动态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,我们返回一个只包含该特定研究的列的表(不同的Terminate为仅用于该研究的列),但是当查询时转为存储过程并运行它生成一个包含所有研究列的表(所有不同的终止为列)。

当作为存储过程运行时,似乎忽略了第一个where子句(在select group_concat中),但是当作为简单查询运行时则不是这种情况。

存储过程调用:

selectPivotedTermpoints('bhp_03a');

有谁知道为什么会出现这种情况和/或我如何纠正这个问题?

1 个答案:

答案 0 :(得分:4)

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

(您也可以使用Dashboard.studyid,但更改参数名称会减少混淆;而且@finalSQL中的查询行为也不是肯定的。)< / em>的