2013-04-26 100 views
2

我有很少的数据表中的工作,一个MySQL存储过程:SQL存储过程 - 变量太短

SQL Fiddle Demo - >感谢马哈茂德·贾迈勒此。

的问题是,这precedure不能与许多工作的元数据:

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个元数据名称的太长文本?

在此先感谢

回答

2

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

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

你需要增加该值,例如 -

SET @@local.group_concat_max_len=10000; 
+1

非常惊人的..谢谢你!并感谢Mahmoud的编辑!我希望下一次这是我会帮助你;) – 2013-04-26 07:55:16