加载数据Infile @variable为infile错误

时间:2013-01-25 14:29:06

标签: 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);

不幸的是,在运行之后,如下所示的提交有错误: “错误代码:1064。您的SQL语法中有错误......”

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

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

谢谢。

5 个答案:

答案 0 :(得分:6)

来自MySQL documentation的引文:

  

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

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

答案 1 :(得分:4)

通常,不可能直接使用临时文件。

该过程类似于使用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覆盖文件,因此临时文件不得存在。如果您想自动化上一个示例,这是一个严重的问题。

答案 2 :(得分:2)

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

除了Binary Alchemist's answer之外,使用预付费语句也是不可能的,因为它不在此列表中:SQL Syntax Allowed in Prepared Statements

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我的解决方案适用于Linux / Mac / [Windows with bash](例如cygwin)

使用加载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