Unix:从BASH Shell脚本向MYSQL文件传递参数
我想从bashshell脚本向mysql文件传递一些变量 这是我的shell脚本Unix:从BASH Shell脚本向MYSQL文件传递参数,mysql,shell,Mysql,Shell,我想从bashshell脚本向mysql文件传递一些变量 这是我的shell脚本 #!/bin/bash echo $0 Started at $(date) mysql -uroot -p123xyzblabla MyMYSQLDBName<mysqlfile.sql PARAM_TABLE_NAME 问题1:将变量(PARAM_TABLE_NAME)传递到sql文件(mysqlfile.sql)的正确语法是什么? 问题2:如何在sql文件(mysqlfile.sql)中打印变量(P
#!/bin/bash
echo $0 Started at $(date)
mysql -uroot -p123xyzblabla MyMYSQLDBName<mysqlfile.sql PARAM_TABLE_NAME
问题1:将变量(PARAM_TABLE_NAME)传递到sql文件(mysqlfile.sql)的正确语法是什么?
问题2:如何在sql文件(mysqlfile.sql)中打印变量(PARAM_TABLE_NAME)
基本上,我想制作一个通用的SQL脚本,它可以根据接收到的输入从表中加载或选择数据
谢谢没有向SQL文件传递参数这样的事情。SQL文件只不过是包含SQL语句列表的文本文件。这些语句由
mysql
客户端程序解释,就像您在键盘上键入它们一样
mysql
客户端不提供您正在寻找的功能
但我可以想出一些技巧来达到类似的效果:
- 在读取SQL文件之前创建/填充配置表。然后编写SQL文件,以便将此表内容考虑在内:
bash> mysql -e "INSERT INTO config_table VALUES(1, 2, 3)" bash> mysql < script.sql
- 用一些占位符编写SQL文件,这些占位符可以随时替换,例如使用
:sed
bash> sed "s/__VAR_A__/mytable/g" script.sql |mysql [example script.sql] SELECT * FROM __VAR_A__ WHERE id = 123;
bash> PARAM1='foo'; PARAM2='bar'
bash> mysql -e "CALL MyProc($PARAM1);"
bash> mysql -e "SELECT MyFunc($PARAM2);"
注意:不可能在SQL中参数化表名,因此在所有情况下都需要使用(除了基于
sed
的hack,我不建议使用它)这是一个旧线程,但我认为对某些人可能仍然有用。像这样的方法应该会奏效:
mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @testVar='customer_name'; source mysqlfile.sql;"
现在可以在mysqlfile.sql文件中使用@testVar(customer_name)
HTH此线程或其他线程中已经回答了传递参数的方法。但是,针对您问题中的示例,我想补充一点,您不能使用variables声明方法作为表名的占位符,如文档所述: 用户变量旨在提供数据值。它们不能直接在SQL语句中用作标识符或标识符的一部分,例如在需要表或数据库名称的上下文中 如果要使用表名参数,仍然可以使用sed或@RandomSeed回答的存储过程或函数 除此之外,另一种方法是在脚本中使用PREPARE和EXECUTE。下面的示例允许您创建一个数据库/架构(如果您想使用存储过程,需要将它们存储在数据库中),如下所示:
[myscript.sql]
set @s=CONCAT("CREATE DATABASE ", @dbname);
PREPARE stmt FROM @s;
EXECUTE stmt;
然后使用其他问题中建议的任何语法设置@dbname变量:
mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @dbname='mydatabase'; source myscript.sql;"
[myscript.sql]
set @s=CONCAT("CREATE DATABASE ", @dbname);
PREPARE stmt FROM @s;
EXECUTE stmt;
mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @dbname='mydatabase'; source myscript.sql;"