【问题标题】:SQL Stored Procedure - variable too shortSQL 存储过程 - 变量太短
【发布时间】:2013-04-26 15:33:42
【问题描述】:

我有一个 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 个元数据名称的过长文本?

提前致谢

【问题讨论】:

    标签: mysql sql stored-procedures pivot


    【解决方案1】:

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

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

    你需要增加这个值,例如-

    SET @@local.group_concat_max_len=10000;
    

    【讨论】:

    • 非常了不起......谢谢你!感谢 Mahmoud 的编辑!我希望下一次是我来帮助你;)
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2010-12-03
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多