我想在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中正确定义文件名变量吗?
谢谢。
答案 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