如何查看准备好的语句还是应该放弃动态表名?

时间:2017-02-07 02:41:46

标签: mysql dynamic-sql

我正在努力更新几年前有人写过的一些PHP / MySQL报告代码。一个PHP页面中有超过50个SQL语句。其中一些创建临时表,所有这些表都引用至少一个动态表(例如Report_201701),这在PHP中使用变量很简单。

但是当我将所有这些语句调整到MySQL Workbench进行故障排除和增强时,这会导致问题,因为我无法查看预准备语句的输出,因为我使用变量作为动态表名

我不熟悉动态SQL。有什么方法可以查看/输出查询结果吗? According to this post似乎我无法。

一些语句返回一个值,我可以通过分配给这样的变量来查看:

set @sqlQuery = 
    Concat(
        'SELECT 1 as "A"
        into @sqlOut;'
    );
    #$opentickets = mysql_result($sqlQuery, 0);
PREPARE stmt1 from @sqlQuery;
EXECUTE stmt1;
deallocate prepare stmt1;
select @sqlOut;

# @sqlOut
-----------
1

但是如果我尝试使用返回多列或多行的结果,我会得到如下错误:

set @sqlQuery = 
    Concat(
        'SELECT 1 as "A", 2 as "B", 3 as "C"
        into @sqlOut;'
    );
    #$opentickets = mysql_result($sqlQuery, 0);
PREPARE stmt1 from @sqlQuery;
EXECUTE stmt1;
deallocate prepare stmt1;
select @sqlOut;

Error Code: 1222. The used SELECT statements have a different number of columns


set @sqlQuery = 
    Concat(
        'SELECT 1 as "A"
        UNION SELECT 2 as "A"
        UNION SELECT 3 as "A"
        into @sqlOut;'
    );
    #$opentickets = mysql_result($sqlQuery, 0);
PREPARE stmt1 from @sqlQuery;
EXECUTE stmt1;
deallocate prepare stmt1;
select @sqlOut;

Error Code: 1172. Result consisted of more than one row

我最好的方法是什么?现在用静态名称替换动态表名称? (我想要永久地这样做,因为在这种情况下临时表不需要有指示日期的名称。)

1 个答案:

答案 0 :(得分:0)

好吧,我偶然发现MySQL Workbench DOES输出准备好的SELECT语句。无需分配变量。不确定这是否会对某人有所帮助,或者是否应将其删除以说明显而易见的事实。

set @sqlQuery = 
    Concat(
        'SELECT 1 as "A", 2 as "B", 3 as "C"
        UNION SELECT 10 as "A", 20 as "B", 30 as "C"
        UNION SELECT 100 as "A", 200 as "B", 300 as "C";'
    );
PREPARE stmt1 from @sqlQuery;
EXECUTE stmt1;
deallocate prepare stmt1;

返回:

A       B       C
'1'     '2'     '3'
'10'    '20'    '30'
'100'   '200'   '300'