为什么存储过程在包含的查询不';MySQL中的t?

为什么存储过程在包含的查询不';MySQL中的t?,mysql,stored-procedures,Mysql,Stored Procedures,我已经在MySQL(服务器版本:5.0.83-community)中创建了一个存储过程,如下所示。当我尝试调用它时,我得到了一个非常奇怪的输出,它与我尝试在过程之外调用查询时有很大不同。为了说明我的意思,我将两个不同的调用联合起来,以便您可以看到非常不同的输出 我知道,如中所述,如果任何参数为NULL,CONCAT将返回NULL变量,但我真的不明白为什么它在以下一种情况下返回NULL,而在另一种情况下则不返回NULL。事实上,两个调用应该返回完全相同的结果。你知道为什么会这样吗?(分隔符//由p

我已经在MySQL(服务器版本:5.0.83-community)中创建了一个存储过程,如下所示。当我尝试调用它时,我得到了一个非常奇怪的输出,它与我尝试在过程之外调用查询时有很大不同。为了说明我的意思,我将两个不同的调用联合起来,以便您可以看到非常不同的输出

我知道,如中所述,如果任何参数为NULL,CONCAT将返回NULL变量,但我真的不明白为什么它在以下一种情况下返回NULL,而在另一种情况下则不返回NULL。事实上,两个调用应该返回完全相同的结果。你知道为什么会这样吗?(分隔符//由phpMyAdmin使用-因此奇怪地缺少声明)

注意:我也看过,但没有一个能让我得出任何令人惊讶的结论。这篇文章对我也没有帮助,因为MySQL在我尝试调用setANSI_NULLS时抛出了这个错误#1193-未知系统变量“ANSI_NULLS”

DROP PROCEDURE `GetVoteID`//
CREATE DEFINER=`u1037413_manager`@`%` PROCEDURE `GetVoteID`(IN minimum_votes INT(11), IN current_round INT(11), INOUT vote_id CHAR(11))
BEGIN
    SET @eliminated_candidates := (
        SELECT GROUP_CONCAT(CONVERT(vote_candidate, CHAR(11)))
        FROM vote_final
        WHERE votes = minimum_votes
        AND round_id = current_round
    );
    SELECT GROUP_CONCAT(CONVERT(vote_id, CHAR(11))) INTO vote_id
    FROM votes_copy
    WHERE FIND_IN_SET(@eliminated_candidates, vote_candidate_1) != 0;
END


CALL GetVoteID('5','1',@vote_id);
SELECT *
FROM (
    (
        SELECT @vote_id vote_id
    ) UNION (
        SELECT GROUP_CONCAT(CONVERT(vote_id, CHAR(11)))
        FROM votes_copy
        WHERE FIND_IN_SET((
            SELECT GROUP_CONCAT(CONVERT(vote_candidate, CHAR(11)))
            FROM vote_final
            WHERE votes = '5'
            AND round_id = '1'
        ), vote_candidate_1) != 0
    )
) t;
产出:

+--------------+
| vote_id      |
+--------------+
| NULL         |  <- incorrect result
+--------------+
| 2,8,33,44,48 |  <- correct result
+--------------+
+--------------+
|投票人|
+--------------+

|空|您能提供一些测试数据吗?除了问题中提供的测试数据之外,您还需要什么类型的测试数据?像sqlfiddle?sqlfiddle会有用的。好的。我删除了我以前的评论,因为我没有让fidde正常工作,但现在我已经设法至少让过程进入模式生成器。但是我不能让它工作。我已经把它注释掉了-如果你知道如何让它工作,请让我知道。以下几点建议:避免将变量命名为表的列,并且超出了变量
INOUT
的长度(您必须计算要分配的长度)。要测试是否正常工作,请更改:
。。。INOUT vote_id CHAR(11).
by
。。。INOUT投票id字符(50).
。。。字符(11)))转换为投票id…
by
。。。CHAR(11)))转换为存储过程中的_vote_id…
。看见