SQL存储过程 - 变量太短

时间:2013-04-26 07:15:28

标签: mysql sql stored-procedures pivot

我有一个mySQL存储过程,它可以处理表中的少量数据:

SQL Fiddle Demo - >感谢Mahmoud Gamal。

问题在于此操作不适用于许多元数据:

CREATE TABLE Metadata (`metadata_id` int, `metadata_name` varchar(25)) ;

INSERT INTO Metadata
    (`metadata_id`, `metadata_name`)
VALUES
    (1, 'duration'),
    (2, 'extension'),
    (3, 'size'),
    (4, 'duration2'),
    (5, 'extension2'),
    (6, 'size2'),
    (7, 'duration3'),
    (8, 'extension3'),
    (9, 'size3'),
    (10, 'duration4'),
    (11, 'extension4'),
    (12, 'size4'),
    (13, 'duration5'),
    (14, 'extension5'),
    (15, 'size5'),
    (16, 'duration6'),
    (17, 'extension6'),
    (18, 'size6')
;

似乎用@声明的会话变量太短了!

此表最后将包含大约150个元数据。

SET @sql = NULL;
SET @cols = NULL;

SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(m.metadata_name = ''',
      m.metadata_name, ''', v.value, 0)) AS ', '''',   m.metadata_name, '''')
  ) INTO @cols
FROM Metadata AS m;

SET @sql = CONCAT('
  SELECT 
    v.file, ', @cols ,'
  FROM `values` AS v
  INNER JOIN metadata AS m ON v.metadata_id = m.metadata_id
  GROUP BY v.file');

prepare stmt 
FROM @sql;

execute stmt;

两个变量@sql@cols适用于此演示中的简单场景,但在我的情况下,我有150个元数据,在这种情况下,我得到一个错误,即变量太短。

如何声明这两个变量,以便他们从连接150个元数据名称中获取这么长的文本?

提前致谢

1 个答案:

答案 0 :(得分:3)

是的,这可能是GROUP_CONCAT功能的问题,它有一个限制。

运行此查询 - SELECT @@local.group_concat_max_len;它将返回GROUP_CONCAT()函数的最大允许结果长度。

您需要增加此值,例如 -

SET @@local.group_concat_max_len=10000;