【问题标题】:Passing column names as a parameters and calling将列名作为参数传递并调用
【发布时间】:2015-10-06 10:34:47
【问题描述】:
CREATE PROCEDURE data1 (IN v_dt2 VARCHAR(256) , v_col2 VARCHAR(256),col2 VARCHAR(256))
BEGIN

 SELECT dt1 as datep, var1 as vars, 'new' as type 
 FROM samp 
 UNION all
 SELECT v_dt2, v_col2, 'col2' as type 
 FROM samp 
 ;

END //
DELIMITER ;

CALL data1 ("dt2","var2","old")

在上面的调用语句中,括号中是列名 但是在输出中将参数作为文本而不考虑列名...如何在 UNION ALL 之后的 select 语句中将它们转换为列名

【问题讨论】:

  • 请不要使用全大写的标题,这会分散注意力和烦人。
  • 简短的回答是您不能将用户变量作为列名或表名

标签: mysql


【解决方案1】:

您的过程返回的是 constant 值,而不是列名。做你想做的事,你需要使用动态SQL(prepareexec):

CREATE PROCEDURE data1 (IN v_dt2 VARCHAR(256), v_col2 VARCHAR(256), col2 VARCHAR(256))
BEGIN
    set @s = '
SELECT dt1 as datep, var1 as vars, ''new'' as type 
FROM samp 
UNION all
SELECT @v_dt2, @v_col2, ''col2'' as type 
FROM samp ';

    set @s = replace(@s, '@v_dt2', v_dt2);
    set @s = replace(@s, '@v_col2', v_col2);
    set @s = replace(@s, '@col2', col2);

    prepare s from @s;
    exec s;

    deallocate prepare s;
END //
DELIMITER ;

【讨论】:

  • 嗨,戈登,它在“新”处抛出错误,请帮助我
  • 不要忘记在 SP 的末尾 DEALLOCATE PREPARE s;
  • CALL data1("dt2","var2","old"),这里old是一个新变量
  • 1054 错误越来越像旧的不在字段列表中
  • @suri5913 。 . .这似乎很奇怪。正在准备的 sql 中的值周围有引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多