我有一个名为的 MySQL 脚本文件query1.sql
,其中包含:
select * FROM $(tblName) LIMIT 10;
我在 MySQL 控制台中,如何将参数传递给脚本?这不会转发变量:
mysql> \. query1.sql -v tblName=Users
我有一个名为的 MySQL 脚本文件query1.sql
,其中包含:
select * FROM $(tblName) LIMIT 10;
我在 MySQL 控制台中,如何将参数传递给脚本?这不会转发变量:
mysql> \. query1.sql -v tblName=Users
您可以使用用户变量来实现您描述的行为。当您将变量用作模式标识符而不是数据值时,您必须使用准备好的语句,以便您可以动态地组合查询。
query1.sql
:
SET @query = CONCAT('Select * FROM ', @tblName, ' LIMIT 10');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
调用为
mysql> SET @tblName = 'Users'; \. query1.sql
来自vidyadhar 的命令行调用对我有用,但只做了一个小的修改:
mysql -u root -p -e"set @temp=1; `cat /home/mysql/Desktop/a.sql`"
这可能对你有用
mysql -u root -p -e"set @temp=1;" < /home/mysql/Desktop/a.sql
和
mysql> set @temp=some_value;
mysql> source file.sql
这几乎与您的问题相似,只需尝试一下
对于 bash 脚本:
tblName=$1
searchFor="%something%"
echo "select * FROM $tblName LIMIT 10;
select * From $tblName where somecolumn like '$searchFor';
" | mysql
对于 powershell:
$tblName="MyTable"
$searchFor="%something%"
"select * FROM $tblName LIMIT 10;
select * From $tblName where somecolumn like '$searchFor';
" | mysql
上面@user4150422 的答案几乎对我有用,但cat
给了我权限问题,所以我不得不使用一个轻微的替代方案。奇怪的source
命令也不能代替 cat 工作,但\.
确实
mysql -u root -p -e"set @temp=1; `\. /home/mysql/Desktop/a.sql`"
通过 mysql 变量使用 bash 变量的高级解决方案,例如@tblName
将值插入特定表:
核心文件 insert.preps 包括程序准备好的语句(SET > PREPARE > EXECUTE > DEALLOCATE):
SET @query = CONCAT("INSERT INTO ", @tblName, " (id, time, file, status) VALUES (?, ?, ?, ?)");
PREPARE stmt FROM @query;
SET @id = '0';
EXECUTE stmt USING @id, @time, @file, @status;
DEALLOCATE PREPARE stmt;
*SET @id = '0';
在文件中预定义,因为id
通常是INT AUTO_INCREMENT PRIMARY KEY
. 它将id
为所有行自动分配正确的。
在 shell 或 bash 脚本中使用变量调用它:
mysql --defaults-extra-file=<(echo $'[client]\npassword='"$db_password") --user=$db_user $db_name -e "
SET @tblName = '$table';
SET @time = '$timeStamp';
SET @file = '$file';
SET @status = '$status';
`cat /path/to/insert.preps`"