gpt4 book ai didi

mysql - 过程中的动态 SQL 查询

转载 作者:行者123 更新时间:2023-11-29 03:02:25 24 4
gpt4 key购买 nike

我想创建一个动态表,但我创建表的内置字符串是 NULL - 为什么?
目标是从现有表中获取列值并创建一个新表,其中的列以这些值命名。

DELIMITER $$
DROP PROCEDURE IF EXISTS fanart_test.get_incomplete_artwork $$
CREATE PROCEDURE fanart_test.get_incomplete_artwork()
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE type_id INT;
DECLARE type_name INT;
DECLARE build_string VARCHAR(20000);

DECLARE cursor1 CURSOR FOR
SELECT type_id,type_name FROM fanart_types WHERE type_section = 3;


DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

OPEN cursor1;

get_results: LOOP
FETCH cursor1 INTO type_id, type_name;
IF finished = 1
THEN LEAVE get_results;
END IF;

IF build_string = ""
THEN SET build_string = CONCAT('CREATE TABLE `tmp_incomplete_artwork`(`', type_name, '` TEXT');
ELSE SET build_string = CONCAT(build_string,',', type_name);
END IF;

SET build_string = CONCAT(build_string,')');

END LOOP get_results;
CLOSE cursor1;

SET @s = build_string;
PREPARE build FROM @s;
EXECUTE build;
DEALLOCATE PREPARE build;

END $$

最佳答案

DECLARE build_string VARCHAR(20000);

build_string 最初没有设置任何值,因此它可能为 NULL。

IF build_string = ""

这永远不会返回 true,因为 NULL = "" 不是 true。

ELSE SET build_string = CONCAT(build_string,',', type_name);

将任何字符串与 NULL 连接将返回 NULL。


回复你的评论:

您已将变量命名为 type_idtype_name,它们与表中的列名相同。这会产生歧义,事实证明 MySQL 更喜欢将标识符解释为局部变量,而不是列名。

所以这样:

SELECT type_id,type_name FROM fanart_types WHERE type_section = 3;

将返回未初始化的 type_id 和 type_name 的当前值,即 NULL。因此,表的所有行都返回一对 NULL。

只需将变量重命名为与表的列名不同,或者对列进行限定,使其明确为列而不是变量:

SELECT f.type_id, f.type_name FROM fanart_types f WHERE f.type_section = 3;

您可能还想将 type_name 声明为 TEXT 而不是 INT

关于mysql - 过程中的动态 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21034579/

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