14

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

谢谢你。

4

5 回答 5

9

来自MySQL 文档的引用:

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

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

于 2013-08-21T21:00:31.330 回答
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;

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

于 2015-08-13T11:46:08.900 回答
2

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

除了Binary Alchemist 的 回答之外,预配对语句也不可能,因为它不在此列表中:SQL Syntax Allowed in Prepared Statements

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

于 2014-04-14T01:48:57.300 回答
1

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

于 2013-06-11T04:10:18.107 回答
0

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

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

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
于 2017-11-30T11:46:05.093 回答