CAST到只在MySQL运行时知道的column_type?

时间:2012-06-10 00:35:56

标签: mysql dynamic-sql

在MySQL中,我正在从column_type检索information_schema.columns,然后想要生成一个SELECT语句CASTscolumn_type。但是,CASTCONVERT似乎都对数据类型有自己的想法。例如,我经常从信息架构中收到VARCHAR(64)TEXTINT(10) UNSIGNED,并且希望基本上执行CONVERT(`Table`.`Column`, INT(10) UNSIGNED),但它说这是语法错误。

我需要将其写为CONVERT(`Table`.`Column`, UNSIGNED),但在这种情况下,我将需要编写代码来解析column_type的每个可能响应并将其转换为CAST相当于,即便如此,也不能保证生成我需要的代码:如果我正在使用BIGINT并尝试将其填充到INT中怎么办? 有没有办法对用于定义表的实际列类型执行强制转换?

1 个答案:

答案 0 :(得分:0)

因此,您希望使用另一个SQL语句中的值来创建SQL语句。

这称为“动态SQL”,在MySQL中,这只能通过在prepared statement内创建stored procedure来实现。此外,只能从user variable创建预准备语句。

所以你最终会得到这样的东西:

CREATE PROCEDURE ...() BEGIN
  DECLARE desired_type VARCHAR(255);
  SELECT column_type FROM information_schema.columns ... INTO desired_type;
  SET @your_dynamic_sql = CONCAT("UPDATE ... SET ... = CONVERT(..., ", desired_type, ");");
  PREPARE update_statement FROM @your_dynamic_sql;
  EXECUTE update_statement;
END