1

如何在使用动态 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; 

有没有更简单的方法?

干杯,卢卡斯

4

1 回答 1

1

您问,如何在使用动态 SQL 和 concat 方法的情况下在 SQL 查询中使用变量?

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

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

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

 SELECT xxx FROM yyy WHERE zzz

变成像这样的字符串

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

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

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

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

于 2014-12-11T02:15:30.403 回答