场景::我试图将字符串设置为变量,然后将其传递给准备好的语句。我正在使用“ concat”函数来创建将要传递的字符串。
查询:
set @floatvar := 'test1'
set @random_var2 := concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount');
肥胖:我的查询中有更多部分要包含在字符串中,但是即使只有这个,我也已经遇到了麻烦,所以我要逐步进行。
问题::当我尝试运行此命令时,在第2行出现语法错误(SQL错误1064)。我不知道为什么会这样。
问题:导致此问题的原因是什么,如何解决?
答案 0 :(得分:1)
没有这样的 SELECT .. INTO .. :
SELECT
concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount')
INTO @myquery;
样品
MariaDB [test]> SET @floatvar := 'test1' ;
Query OK, 0 rows affected (0.002 sec)
MariaDB [test]> SELECT
-> concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount')
-> INTO @myquery;
Query OK, 1 row affected (0.000 sec)
MariaDB [test]>
MariaDB [test]> SELECT @myquery;
+--------------------------------------------------------------------------------+
| @myquery |
+--------------------------------------------------------------------------------+
| SELECT test1 AS Fields, COUNT(CASE WHEN test1 IS NULL THEN 1 END) AS NullCount |
+--------------------------------------------------------------------------------+
1 row in set (0.000 sec)
MariaDB [test]>
答案 1 :(得分:1)
set @floatvar := 'test1' ;
set @random_var2 := (select concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount'));
select @random_var2;
为此
SELECT test1 AS Fields, COUNT(CASE WHEN test1 IS NULL THEN 1 END) AS NullCount;
结果
ERROR 1054 (42S22): Unknown column 'test1' in 'field list'
如果您这样做
prepare sqlstmt = @random_var2;
execute sqlstmt;
deallocte prepare sq;stmt;
结果
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '= @random_var2' at line 1
最好在激发到动态sql之前检查准备好的语句是否工作,因为来自动态sql的错误消息可能没有帮助。