将数据Infile @variable加载到infile错误

问题描述:

我想在Load data Infile中使用一个变量作为文件名。运行后将数据Infile @variable加载到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); 

不幸的是,有像下面的commment一个错误:我运行下面的代码 “错误代码:1064你在你的SQL语法错误......”

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

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

谢谢。

该sysntax无法工作,因为变量由服务器解释,并且该文件被mysql客户端读取。 因此对于客户端@ d2是非法文件名。

MySQL documentation引文:

文件名必须作为一个字符串。在Windows上,在路径名称中将反斜杠指定为正斜杠或反斜杠。 character_set_filesystem系统变量控制文件名的解释。

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

不幸的是,这似乎不可能在MySQL中。

除了Binary Alchemist'sanswer,这也是不可能的prepaired陈述或者,因为它不在此名单:SQL Syntax Allowed in Prepared Statements

你可以使用soemthing外部产生的负荷数据INFILE语句,然后运行该SQL 。例如,你可以在Excel中创建它。

一般来说,这是不可能的,但可以使用临时文件。

该过程与使用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; 

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

+0

如果您需要在连接到LOAD DATA INFILE与文件处理做任何事情,我已经当真棒结果我将它与Bash脚本配对。 以下是它的工作方式: 1)让Bash将您的约会数据文件复制到一个保存在“未处理”文件夹中的临时工作文件中。然后调用具有加载数据infile进程的sql。 SQL运行后,你可以让Bash删除工作文件并移动 但你CAN –

我的解决方案适用于Linux的/ MAC/[视窗使用bash](如Cygwin的)

与负载SQL,例如创建模板加载。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