Unix:从BASH Shell脚本向MYSQL文件传递参数

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

我想从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)中打印变量(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回答的存储过程或函数

除此之外,另一种方法是在脚本中使用PREPAREEXECUTE。下面的示例允许您创建一个数据库/架构(如果您想使用存储过程,需要将它们存储在数据库中),如下所示:

[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;"