Подтвердить что ты не робот

Загружать данные Infile @variable в infile error

Я хочу использовать переменную в качестве имени файла в 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?

Спасибо.

4b9b3361

Ответ 1

Цитата из Документация по MySQL:

Имя файла должно быть задано как буквальная строка. В Windows укажите обратную косую черту в именах путей в виде косой черты или двойных обратных косых черт. Системная переменная character_set_filesystem контролирует интерпретацию имени файла.

Это означает, что он не может быть параметром подготовленного оператора, хранимой процедуры или чего-либо "серверного". Оценка строки/пути должна выполняться на стороне клиента.

Ответ 2

В общем, это невозможно напрямую, но вы можете использовать временный файл.

Процедура аналогична использованию комбинации 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, поэтому временный файл не должен существовать. Это серьезная проблема, если вы хотите автоматизировать предыдущий пример.

Ответ 3

Этот sysntax не может работать, поскольку переменные интерпретируются сервером, и файл читается клиентом mysql. Поэтому для клиента @d2 является недопустимым именем файла.

Ответ 4

К сожалению, это не представляется возможным в mysql.

В дополнение к , это также невозможно с подготовленными утверждениями, так как это а не в этом списке: Синтаксис SQL, разрешенный в подготовленных отчетах

Вы можете использовать soemthing external для генерации инструкции infile load data, а затем запустите sql. Например, вы можете создать его в Excel.

Ответ 5

Мое решение работает на Linux/Mac/[Windows с bash] (например, cygwin)

Создайте шаблон с загрузкой SQL, например. load.tpl - отметьте %FILENAME% placeholder

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