Загружать данные 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?
Спасибо.
Ответы
Ответ 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