mysq - использовать переменную (дату), когда SELECT * INTO OUTFILE (по имени файла)
Добрый день,
Я использую INTO OUTFILE для создания файла CSV с информацией о SELECT. Мне нужно использовать переменные, чтобы персонализировать имя CSV.
Например, я хочу добавить дату СЕЙЧАС ().
Это идея (но она не работает):
SET @outpath = "out/";
SET @outfile = (SELECT NOW());
SET @outextension = "_EMAIL_WithoutEmail.csv";
SET @outfull = CONCAT(@outpath,@outfile,@outextension);
SELECT *
FROM `vn_db_tmp`
INTO OUTFILE @outfull
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Кто-нибудь знает, возможно ли это? Спасибо
3 ответа
Решение
Одним из вариантов является использование 13.5 подготовленного синтаксиса операторов SQL.
Пример:
...
SET @`outfull` := CONCAT('out/', NOW(), '_EMAIL_WithoutEmail.csv');
SET @`qry` := CONCAT('SELECT *
INTO OUTFILE \'', @`outfull`, '\'
FIELDS TERMINATED BY \';\'
ENCLOSED BY \'"\'
LINES TERMINATED BY \'\n\'
FROM `vn_db_tmp`');
PREPARE `stmt` FROM @`qry`;
SET @`qry` := NULL;
EXECUTE `stmt`;
DEALLOCATE PREPARE `stmt`;
...
Просто оставь это здесь. Чтобы избежать проблем с выходом файла, вы должны использовать «путь к файлу». используйте обратную косую черту + 'для' специального символа.
SET @outfull = CONCAT('\'/path/to/file/', date_format (NOW(),'%Y-%m-%d_%H:%i:%s'), '_app.log\'');
SET @SQL = CONCAT("SELECT * FROM some_table INTO OUTFILE ",@outfull);
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Единственный способ сделать это - использовать ПОДГОТОВИТЕЛЬНОЕ ЗАЯВЛЕНИЕ
// You can set your VARS or use it direcly in the CONCAT
SET @outpath = "out/";
SET @outfile = (SELECT NOW());
SET @outextension = "_EMAIL_WithoutEmail.csv";
// GENERATE your QUERY with CONCAT into @SQL
SELECT CONCAT("SELECT * FROM `vn_db_tmp` INTO OUTFILE ",@outpath,@outfile,@outextension,'....') INTO @SQL;
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;