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

问题描述 投票:0回答:2

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

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

存储过程调用:

selectPivotedTermpoints('bhp_03a');

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

mysql stored-procedures dynamic-sql
2个回答
12
投票

我最近在另一个问题中帮助了遇到类似问题的人;这让我们困惑了很长一段时间。将参数名称更改为其他名称,我猜测

WHERE
正在使用它而不是表中的字段。

(你也许也可以摆脱

Dashboard.studyid
,但更改参数名称会减少混乱;而且我也不确定@finalSQL中的查询将如何表现。)


0
投票

@Uueerdo,非常感谢。这让 SQL 引擎感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.