gpt4 book ai didi

mysql - 在表名中使用变量而不使用动态 SQL

转载 作者:行者123 更新时间:2023-11-29 12:31:33 26 4
gpt4 key购买 nike

如何在 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;

有没有更简单的方法?

干杯,卢卡斯

最佳答案

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

抱歉,你不能。动态 SQL 是 MySQL 中的实现方式。

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

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

 SELECT xxx FROM yyy WHERE zzz

转换为字符串

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

然后他们继续使用数据值的绑定(bind)变量。

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

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

关于mysql - 在表名中使用变量而不使用动态 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27414253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com