我可以在mysql中使用变量指定OUTFILE吗

我可以在mysql中使用变量指定OUTFILE吗,mysql,sql,variables,Mysql,Sql,Variables,有没有一种方法可以做到以下几点?这不起作用,但显示了我想做什么 SET @OutputPath = '/Users/jo/Documents' SET @fullOutputPath = CONCAT(@OutputPath,'/','filename.csv') SET @fullOutputPath2 = CONCAT(@OutputPath,'/','filename2.csv') SELECT * INTO OUTFILE @fullOutputPath FIELDS TERMINAT

有没有一种方法可以做到以下几点?这不起作用,但显示了我想做什么

SET @OutputPath = '/Users/jo/Documents'
SET @fullOutputPath = CONCAT(@OutputPath,'/','filename.csv')
SET @fullOutputPath2 = CONCAT(@OutputPath,'/','filename2.csv')

SELECT * INTO OUTFILE @fullOutputPath
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName;

SELECT * INTO OUTFILE @fullOutputPath2
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName2;

您无法在mysql CLI中执行此操作,但通过这种方式它可以正常工作

mysql -e "SELECT * FROM database.tableName;" -u user -p database > filename.csv
编辑:保存数据。不使用仅变量常量值而将表转换为文件

-- folder_path could could be like => c:/users/sami
-- choose the directory/folder already available in system
-- and make sure you have access to write the file there

SELECT * INTO OUTFILE 'folder_path/filename.csv'
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName;
现在使用变量

每当您必须在sql中使用变量名时,都需要动态sql,它只适用于存储过程,既不适用于简单sql查询,也不适用于触发器或函数

SET @OutputPath := 'Users/jo/Documents'; //or any folder_path
SET @fullOutputPath := CONCAT(@OutputPath,'/','filename.csv');
SET @fullOutputPath2 := CONCAT(@OutputPath,'/','filename2.csv');

set @q1 := concat("SELECT * INTO OUTFILE ",@fullOutputPath,
" FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName");

set @q2 := concat("SELECT * INTO OUTFILE ",@fullOutputPath2,
" FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName2");

prepare s1 from @q1;
execute s1;deallocate prepare s1;

prepare s1 from @q2;
execute s1;deallocate prepare s1;
由于您的查询中已经有了“和”,因此我使用和\连接了您的查询,以转义原始查询,以确保其作为文字字符使用,而不是用于连接

我刚才讲了变量在sql中的用法。首先,您应该确保您的查询是否像顶部的示例一样工作,而不使用变量


结论:如果您的上述查询工作正常,那么鉴于您在某些存储过程中使用了动态sql,那么我的动态sql也能正常工作。

我的carma值较低,因此我在Sami的帖子中发布了一个答案,该答案应该作为注释-您需要用引号将文件名括起来。@fullOutputPath前后添加了注释:

set @q1 := concat("SELECT * INTO OUTFILE '",@fullOutputPath,
"' FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName");

如果您想从bash执行此操作,即以csv格式将一些数据从mysql导出到具有动态名称的文件中,可能会更容易和更可读,如下所示

带有嵌入式bash变量的SQL:

where (e.timestamp >= ${begin_ts} and e.timestamp < ${end_ts}) order by ed.timestamp ASC ) a
INTO OUTFILE '${export_path}' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
以及运行sql文件的bash脚本。请注意,envsubt命令用于计算sql脚本并替换变量

#!/bin/bash
mysql_db="dbname"
mysql_user="mysqlpass"
mysql_pass="password"
export_path="./data.csv"
begin_ts="1478278490"
current_ts=$(date +%s -u)

sql=`export_path=${export_path} begin_ts=${last_ts} end_ts=${current_ts} envsubst < export.sql`
mysql $mysql_db -u $mysql_user -p$mysql_pass -e"${sql}"

是的,您可以使用变量,但只能在存储过程中使用动态sql。如果不使用SELECT。。。进入OUTFILE,然后尝试从shell打开一个全新的蠕虫罐:/n当选择。。。INTO OUTFILE位于存储例程中,以及其他返回结果集ie创建过程的SELECT。。。开始选择1;选择2到输出文件;选择3个;终止