在MySQL中,我正在从column_type
检索information_schema.columns
,然后想要生成一个SELECT
语句CASTs
到column_type
。但是,CAST
和CONVERT
似乎都对数据类型有自己的想法。例如,我经常从信息架构中收到VARCHAR(64)
,TEXT
和INT(10) UNSIGNED
,并且希望基本上执行CONVERT(`Table`.`Column`, INT(10) UNSIGNED)
,但它说这是语法错误。
我需要将其写为CONVERT(`Table`.`Column`, UNSIGNED)
,但在这种情况下,我将需要编写代码来解析column_type
的每个可能响应并将其转换为CAST
相当于,即便如此,也不能保证生成我需要的代码:如果我正在使用BIGINT并尝试将其填充到INT中怎么办?
有没有办法对用于定义表的实际列类型执行强制转换?
答案 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