如何查看准备好的语句或者我应该放弃动态 table 名称?
How to view a prepared statement OR should I abandon dynamic table names?
我正在努力更新几年前某人写的一些 PHP/MySQL 报告代码。单个 PHP 页面中有 50 多个 SQL 语句。其中一些创建临时tables,它们都引用至少一个动态table(例如Report_201701),这在PHP中使用变量很简单。
但是当我将所有这些语句调整为 MySQL Workbench 以进行故障排除和增强时,这会导致问题,因为我无法查看准备好的语句的输出,因为我正在使用动态 table 名称的变量。
我不熟悉动态 SQL。有什么方法可以 view/output 查询结果吗? According to this post 看来我做不到。
几个语句 return 一个单一的值,我已经能够通过分配给这样的变量来查看:
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
但是如果我尝试使用 return 多列或多行的结果,我会得到如下错误:
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
我最好的方法是什么?暂时用静态名称替换动态 table 名称? (我正在考虑永久这样做,因为在这种情况下 temp tables 不需要具有指示日期的名称。)
好吧,我偶然发现 MySQL Workbench 会输出准备好的 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;
Returns:
A B C
'1' '2' '3'
'10' '20' '30'
'100' '200' '300'
我正在努力更新几年前某人写的一些 PHP/MySQL 报告代码。单个 PHP 页面中有 50 多个 SQL 语句。其中一些创建临时tables,它们都引用至少一个动态table(例如Report_201701),这在PHP中使用变量很简单。
但是当我将所有这些语句调整为 MySQL Workbench 以进行故障排除和增强时,这会导致问题,因为我无法查看准备好的语句的输出,因为我正在使用动态 table 名称的变量。
我不熟悉动态 SQL。有什么方法可以 view/output 查询结果吗? According to this post 看来我做不到。
几个语句 return 一个单一的值,我已经能够通过分配给这样的变量来查看:
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
但是如果我尝试使用 return 多列或多行的结果,我会得到如下错误:
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
我最好的方法是什么?暂时用静态名称替换动态 table 名称? (我正在考虑永久这样做,因为在这种情况下 temp tables 不需要具有指示日期的名称。)
好吧,我偶然发现 MySQL Workbench 会输出准备好的 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;
Returns:
A B C
'1' '2' '3'
'10' '20' '30'
'100' '200' '300'