无法使用 ODBC 将用户定义的变量从 MySQL 设置为 Excel
Can't Set User-defined Variable From MySQL to Excel With ODBC
我有一个查询,在主查询之上设置了一个用户定义的变量。是这样的。
set @from_date = '2019-10-01', @end_date = '2019-12-31';
SELECT * FROM myTable
WHERE create_time between @from_date AND @end_date;
当我在MySQL Workbench中执行它时它工作得很好,但是当我通过MySQL ODBC将它放入Excel时它总是显示这样的错误.
我需要那个用户定义的变量才能在 Excel 中工作。我应该在查询中更改什么?
ODBC 连接器很可能通过语句或准备好的语句与 MySQL 通信,一次一个语句,并且不支持用户变量。准备好的语句是您可以绑定日期文字的一种方式。根据您的示例,此处的另一个选择是仅内联日期文字:
SELECT *
FROM myTable
WHERE create_time >= '2019-10-01' AND create_time < '2020-01-01';
旁注:我在 create_time
上表达了支票,它似乎想包括 2019 年最后一个季度,使用不等式。这样做的原因是,如果 create_time
是 timestamp/datetime,那么在 RHS 上使用 BETWEEN
和 31-December 将只包括那天的午夜,之后的任何时间都不会。
对变量值初始化使用子查询:
SELECT *
FROM myTable,
( SELECT @from_date := '2019-10-01', @end_date := '2019-12-31' ) init_vars
WHERE create_time between @from_date AND @end_date;
关注:
使用的是SELECT
,不是SET
;
- 使用了赋值运算符
:=
,=
运算符将被视为比较一个,在这种情况下给出错误的结果;
- 别名(
init_vars
)可以是任意的,但它是强制性的。
变量被初始化一次,但可能会被多次使用。
如果您的查询很复杂(嵌套),则必须在最内部的子查询中初始化变量。或者在第一个 CTE 中,如果 DBMS 版本知道 CTE。如果查询非常复杂,无法确定"the most inner"是什么子查询,那么先查找table被扫描的执行计划,并使用其子查询对变量init(但记住执行计划可能随时更改)。
我有一个查询,在主查询之上设置了一个用户定义的变量。是这样的。
set @from_date = '2019-10-01', @end_date = '2019-12-31';
SELECT * FROM myTable
WHERE create_time between @from_date AND @end_date;
当我在MySQL Workbench中执行它时它工作得很好,但是当我通过MySQL ODBC将它放入Excel时它总是显示这样的错误.
我需要那个用户定义的变量才能在 Excel 中工作。我应该在查询中更改什么?
ODBC 连接器很可能通过语句或准备好的语句与 MySQL 通信,一次一个语句,并且不支持用户变量。准备好的语句是您可以绑定日期文字的一种方式。根据您的示例,此处的另一个选择是仅内联日期文字:
SELECT *
FROM myTable
WHERE create_time >= '2019-10-01' AND create_time < '2020-01-01';
旁注:我在 create_time
上表达了支票,它似乎想包括 2019 年最后一个季度,使用不等式。这样做的原因是,如果 create_time
是 timestamp/datetime,那么在 RHS 上使用 BETWEEN
和 31-December 将只包括那天的午夜,之后的任何时间都不会。
对变量值初始化使用子查询:
SELECT *
FROM myTable,
( SELECT @from_date := '2019-10-01', @end_date := '2019-12-31' ) init_vars
WHERE create_time between @from_date AND @end_date;
关注:
-
使用的是
SELECT
,不是SET
;- 使用了赋值运算符
:=
,=
运算符将被视为比较一个,在这种情况下给出错误的结果; - 别名(
init_vars
)可以是任意的,但它是强制性的。
变量被初始化一次,但可能会被多次使用。
如果您的查询很复杂(嵌套),则必须在最内部的子查询中初始化变量。或者在第一个 CTE 中,如果 DBMS 版本知道 CTE。如果查询非常复杂,无法确定"the most inner"是什么子查询,那么先查找table被扫描的执行计划,并使用其子查询对变量init(但记住执行计划可能随时更改)。