在没有动态SQL的表名中使用变量

时间:2014-12-11 02:12:25

标签: mysql dynamic tablename

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

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

以下是我想做的一个例子:

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; 

有更简单的方法吗?

干杯, 卢卡斯

1 个答案:

答案 0 :(得分:1)

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

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

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

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

这样的字符串
 SELECT xxx FROM yyy WHERE zzz

成为

之类的字符串
 SELECT id,name,value FROM transaction WHERE id=?

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

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

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