Mysql 在动态视图中使用Prepared语句

Mysql 在动态视图中使用Prepared语句,mysql,view,mysql-error-1054,Mysql,View,Mysql Error 1054,这是我的密码 Drop procedure if exists test// CREATE PROCEDURE test(IN woeid VARCHAR(15)) BEGIN SET @w1 := woeid; SET @sql = CONCAT('CREATE OR REPLACE VIEW temp AS SELECT * FROM test_table gp

这是我的密码

Drop procedure if exists test//
CREATE PROCEDURE test(IN woeid VARCHAR(15))
  BEGIN
   SET @w1 := woeid;
SET @sql = CONCAT('CREATE OR REPLACE VIEW temp 
                   AS
                   SELECT * 
                   FROM test_table gp
                   WHERE gp.name =', @w1);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END//
Delimiter ;

call test('ABCD');
我得到的错误是 错误代码:1054。where子句中的未知列“ABCD”


请帮忙

听起来好像您在不必要地使用视图,而其他方法更合适

但是,它不起作用的原因是您没有引用字符串文字,因此生成的SQL包含
WHERE gp.name=ABCD
,而它至少需要
WHERE gp.name='ABCD'
。您可以使用MySQL函数实现此目的,但最好将值参数化:

DELIMITER //
DROP PROCEDURE IF EXISTS test//
CREATE PROCEDURE test(IN woeid VARCHAR(15))
BEGIN
  SET @w1:=woeid, @sql:=CONCAT('
    CREATE OR REPLACE VIEW temp AS
      SELECT * 
      FROM   test_table
      WHERE  name = ?
  ');
  PREPARE stmt FROM @sql;
  EXECUTE stmt USING @w1;
  DEALLOCATE PREPARE stmt;
  SET @w1:=NULL, @sql:=NULL;
END//
DELIMITER ;

CALL test('ABCD');

@eggyal有什么选择??我需要gp.name由用户定义。因为我使用的是动态视图,所以我需要使用prepare语句,因为视图的select不能包含变量或参数错误1351Awesome,所以我不能使用此语句。成功了。正如我所见,这是报价的问题。你能解释一下问题是什么吗?@user2098662:我的回答中已经解释过了。。。这没有道理吗?你还不明白什么?