Mysql 将数据infle@变量加载到infle error中

Mysql 将数据infle@变量加载到infle error中,mysql,Mysql,我想在加载数据填充中使用一个变量作为文件名。我运行以下代码: 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); 不幸的是,运行后,出现如下错误: “错误代码:1064。您的SQL语法有错误……” 变量“@D2”在

我想在加载数据填充中使用一个变量作为文件名。我运行以下代码:

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);
不幸的是,运行后,出现如下错误: “错误代码:1064。您的SQL语法有错误……”

变量“@D2”在代码中加了下划线,因此表示此错误是由此变量引起的

您能帮助我如何在LOAD DATA@variable infle中正确定义文件名变量吗


谢谢。

此sysntax无法工作,因为变量由服务器解释,而文件由mysql客户端读取。 因此,客户端@d2的文件名是非法的。

引用自:

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


这意味着它不能是已准备语句、存储过程或任何“服务器端”的参数。字符串/路径计算必须在客户端完成。

不幸的是,这在mysql中似乎不可能实现

除此之外,预先准备好的语句也不可能,因为它不在此列表中:


您可以使用soemthing external生成load data infile语句,然后运行sql。例如,您可以在Excel中创建它。

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

该过程类似于使用PREPARE-EXECUTE组合。请注意,不能使用“准备加载数据填充”,因此需要临时文件

下面是一个如何读取日期为今天的文件的示例:

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;
警告:您不能用mysql覆盖文件,因此临时文件不能存在。如果要使前面的示例自动化,这是一个严重的问题


我的解决方案在Linux/Mac/[Windows with bash](例如cygwin)上运行

使用load SQL创建一个模板,例如load.tpl——注意
%FILENAME%
占位符

LOAD DATA LOCAL INFILE '/path/to/data/%FILENAME%'
INTO TABLE Avaya_test ( Agent_Name, Login_ID, ACD_Time );
然后运行以下命令:

for n in `ls *.txt`; do echo $n; sed -e 's/%FILENAME%/'$n'/g' load.tpl | mysql -u databaseUser databaseName; done

如果您需要在加载数据填充时进行任何文件处理,那么当我将其与Bash脚本配对时,我已经获得了非常好的结果。其工作原理如下:1)让Bash将日期数据文件复制到“未处理”文件夹中的临时工作文件中。然后调用具有加载数据填充进程的sql。sql运行后,可以让Bash删除工作文件并移动