Невозможно передать значение параметра в подготовленных операторах Concat select

#mysql

#mysql

Вопрос:

Я обнаружил, что хранимая процедура не выполняет только эту часть:

           SET @sql 
          = CONCAT('SELECT TraineeID, ', @sql, ' 
                    from tbl_submit_coursefee c
                    where c.BatchID='BID'
                    group by c.TraineeID');
  

в предложении where '' кавычки не разрешены, а запрос без кавычек возвращает пустой, но если я прямо указываю значение параметра в предложении where, то это работает. Я действительно стек с этим.

Вот мой подготовленный оператор (работает нормально):

 SET @sql = NULL;    
SELECT
     GROUP_CONCAT(DISTINCT
     CONCAT ('MAX(IF(BillNo = ''', BillNo, ''', CRA, NULL)) AS `Inv.', BillNo, '`') 
         )  INTO @sql
    FROM tbl_submit_coursefee
    WHERE BatchID="ID-Welding/FMMTTC-01M/R8/01";

    SET @sql 
      = CONCAT('SELECT TraineeID, ', @sql, ' 
                from tbl_submit_coursefee c
                where c.BatchID="ID-Welding/FMMTTC-01M/R8/01"
                group by c.TraineeID');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  

при помещении этого оператора в хранимую процедуру (не работает):

 DELIMITER @@
DROP PROCEDURE GetRetainment @@
CREATE PROCEDURE vtproject.GetRetainment
(IN `BID` VARCHAR(100))
BEGIN
    SET @sql = NULL;
    SELECT
        GROUP_CONCAT(DISTINCT
            CONCAT ('MAX(IF(BillNo = '', BillNo, '', CRA, NULL)) AS `Inv.', BillNo, '`') 
        )   INTO @sql
    FROM tbl_submit_coursefee
    WHERE BatchID=BID;

    SET @sql 
      = CONCAT('SELECT TraineeID, ', @sql, ' 
                from tbl_submit_coursefee c
                where c.BatchID='BID'
                group by c.TraineeID');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END @@ 
DELIMITER ; 
  

Если я select @sql раньше prepare stmt FROM @sql затем выводил, как показано ниже:

 SELECT TraineeID, MAX(IF(BillNo = 1, CRA, NULL)) AS `Inv.1`,MAX(IF(BillNo = 2, CRA, NULL)) AS `Inv.2`,MAX(IF(BillNo = 3, CRA, NULL)) AS `Inv.3`,MAX(IF(BillNo = 4, CRA, NULL)) AS `Inv.4`,MAX(IF(BillNo = 5, CRA, NULL)) AS `Inv.5`,MAX(IF(BillNo = 6, CRA, NULL)) AS `Inv.6`,MAX(IF(BillNo = 7, CRA, NULL)) AS `Inv.7` from tbl_submit_coursefee c where c.BatchID=BID group by c.TraineeID
  

Комментарии:

1. то, что выводится select @sql; непосредственно перед PREPARE stmt FROM @sql; , я думаю, BID должно быть таким ''BID'' , две двойные кавычки означают, что вы используете его как escape-символ

2. ''BID'' двойные кавычки еще не взяты, и я просто обновляю то, что возвращаю, если я установил select @sql раньше prepare stmt From @sql . пожалуйста, взгляните.

3. если я использую «BID», mysql возвращает пустой результат

4. Что это за BID какая-то переменная или Value ?

5. «ID-Welding/FMMTTC-01M / R8/01»

Ответ №1:

вам нужно экранировать кавычки, вот так :

 SET @sql 
= CONCAT('SELECT TraineeID, ', @sql, ' 
from tbl_submit_coursefee c 
where c.BatchID=''',BID,''' 
group by c.TraineeID');
  

согласно документу:http://dev.mysql.com/doc/refman/5.7/en/string-literals.html

Комментарии:

1. таким образом, запрос выполняется хорошо, но как только он выполняется, ''' ,BID, '''; измените на '' ,BID, ''; , наконец, это не будет выполняться дальше.

Ответ №2:

Я сам нашел решение другим способом.

 BEGIN
SET @sql = NULL;
SET @bid=BID;
SELECT
     GROUP_CONCAT(DISTINCT
        CONCAT ('MAX(IF(BillNo = ', BillNo, ', CRA, NULL)) AS `Inv.', BillNo, '`') 
     )  INTO @sql
FROM tbl_submit_coursefee
WHERE BatchID=@bid;

SET @sql 
  = CONCAT('SELECT TraineeID, ', @sql, ' 
            from tbl_submit_coursefee c
            where c.BatchID=@bid
            group by c.TraineeID');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END