加载数据Infile @variable为infile错误

Haw*_*360 13 mysql

我想在Load data Infile中使用变量作为文件名.我运行以下代码:

Set @d1 = 'C:/Users/name/Desktop/MySQL/1/';
Set @d2 = concat( @d1, '20130114.txt');
load data local infile  @d2  into table Avaya_test (Agent_Name, Login_ID,ACD_Time);
Run Code Online (Sandbox Code Playgroud)

不幸的是在运行之后,如下所示的提交有一个错误:"错误代码:1064.你的SQL语法中有错误......"

变量"@ D2"在此代码中带下划线,因此表示此错误是由此变量引起的.

你能帮我解决一下如何在LOAD DATA @variable infile中正确定义文件名变量吗?

谢谢.

Bin*_*ist 7

来自MySQL文档的引用:

文件名必须以文字字符串形式给出.在Windows上,将路径名中的反斜杠指定为正斜杠或加倍反斜杠.character_set_filesystem系统变量控制文件名的解释.

这意味着它不能是预准备语句,存储过程或任何"服务器端"的参数.字符串/路径评估必须在客户端完成.


小智 5

一般来说,不能直接使用,但可以使用临时文件。

该过程类似于使用组合 PREPARE-EXECUTE。请注意,您不能将 PREPARE 与 LOAD DATA INFILE 一起使用,因此您需要一个临时文件。

以下是如何读取具有今天日期的文件的示例:

SET @sys_date = CURRENT_DATE();

SET @trg_file = CONCAT("LOAD DATA INFILE '/home/data/file-",@sys_date, "' INTO TABLE new_data FIELDS TERMINATED BY ' ';");

SELECT @trg_file INTO OUTFILE '/tmp/tmp_script.sql';

SOURCE /tmp/tmp_script.sql;
Run Code Online (Sandbox Code Playgroud)

警告:你不能用 mysql 覆盖文件,因此临时文件不能存在。如果你想自动化前面的例子,这是一个严重的问题。


小智 1

这个 sysntax 不能工作,因为变量是由服务器解释的,文件是由 mysql 客户端读取的。因此对于客户端来说@d2是一个非法的文件名。