【问题标题】:Using a variable in a table name without dynmaic SQL在没有动态 SQL 的情况下在表名中使用变量
【发布时间】:2014-12-11 02:12:24
【问题描述】:

如何不使用动态 SQL 和 concat 方法在 SQL 查询中使用变量?

我希望能够在脚本开头声明变量,然后在整个脚本中使用它们(例如表名)

这是我想做的一个例子:

declare variables
Set @Table1 = 'WhatsOn_20141208'

-- drop and re-create table
drop table if exists @Table1;
CREATE TABLE @Table1 (
rac_account_no  varchar(100),
addressLine2    varchar(100)
);

-- load data into table
LOAD DATA LOCAL INFILE 'C:/Example.txt' 
INTO TABLE @Table1
FIELDS TERMINATED BY '|' 
ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 LINES;

-- update addressLine2 column
Update @Table1
set addressLine2 = REPLACE(addressLine2,"*UNKNOWN*","");

如果表名发生更改,我希望能够在变量中更改一次,而不是查找和替换所有出现的位置。

到目前为止,我发现的唯一解决方案是使用动态 SQL 并像以下示例一样连接字符串:

SET @s = CONCAT('select * from ', @Cat, ' where ID = ', @ID_1); 

PREPARE stmt1 FROM @s; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

有没有更简单的方法?

干杯, 卢卡斯

【问题讨论】:

  • 你不能,你必须使用dynamic sql这个......
  • 您可以在配置文件中使用表名,在 .sql 文件中使用宏表名,使用 python 程序读取配置文件并修改 sql 文件并将修改后的 sql 用于你的目的。
  • 一个数据库结构,其中您有多个具有相同列的表,这通常是数据库出现问题的迹象。很少有任何理由拥有多个相同的表。您可能应该重新审视您的数据库设计。
  • 嘿,戈登,我刚刚随机挑选了一段代码来说明我想要做什么。不要过多地阅读该特定示例。听起来无论如何都不可能。

标签: mysql dynamic tablename


【解决方案1】:

您问,我如何使用动态 SQL 和 concat 方法在 SQL 查询中使用变量

对不起,你不能。动态 SQL 是在 MySQL 中完成的方式。

这适用于模式、表和列的名称——即数据字典名称——而不是值。

大多数需要数据字典项的变量名称的应用程序开发人员使用他们的宿主语言构建查询。也就是说,他们使用 php 或 Java 之类的东西来转换字符串,如

 SELECT xxx FROM yyy WHERE zzz

转换成字符串

 SELECT id,name,value FROM transaction WHERE id=?

然后他们继续使用绑定变量作为数据值。

MySQL 准备好的语句只是在 MySQL 服务器内部而不是在宿主语言中执行此类工作的一种方式。但是(在我看来)准备好的语句很难进行单元测试和故障排除,因此使用您的宿主语言来进行更有效的软件工程。

当应用程序的数据源不受信任时会有点危险,因此检查每个输入的有效性很重要。

【讨论】:

  • 很公平。因此,如果您有从表单或某些外部源提供的变量并传递到 MySQL,您会使用动态 SQL 吗?您会为正在执行的每个查询编写单独的准备/执行/解除分配,还是将多个查询合并到一个准备/执行/解除分配中?
  • 谢谢奥利。非常有帮助:)
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2010-09-08
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多