0

我有一个可以工作的存储过程,但是当我传递一个带有连字符的值时,它会出错。

我用 call create('server-v01',555); 之类的值调用我的过程 我收到以下错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“-v01”附近使用正确的语法

我的程序如下:

DELIMITER $$
CREATE PROCEDURE ct(tname varchar(20), sessionsnum INT(11))
BEGIN
DECLARE maxnum INT;
SET @s = CONCAT('INSERT INTO sessions_poll (server_name,sessions_num)                VALUES(''',tname,''',',sessionsnum,')');
PREPARE stm FROM @s;
EXECUTE stm;
SET @s = CONCAT('DROP TABLE IF EXISTS ', tname);
PREPARE stm FROM @s;
EXECUTE stm;
SET @s = CONCAT('CREATE TABLE ', tname, ' (num INT, max INT)');
PREPARE stm FROM @s;
EXECUTE stm;
SELECT @maxnum:=max(sessions_num) INTO maxnum FROM sessions_poll WHERE server_name=tname AND DATE(ts)=CURDATE();
SET @s = CONCAT('INSERT INTO ', tname, ' (num,max) VALUES (', sessionsnum,',',maxnum,')');
PREPARE stm FROM @s;
EXECUTE stm;
END $$
DELIMITER ;

我的问题是,如何处理带有连字符的变量?

4

1 回答 1

2

您的问题不是如何处理带有破折号的变量,而是如何处理带有破折号的表格。您的过程尝试使用在 中指定的名称创建一个表tname。要创建(或删除)这样的表,您需要用反引号引用它。

DROP TABLE IF EXISTS `server-01`;

特别是你需要

SET @s = CONCAT('DROP TABLE IF EXISTS `', tname, '`');

其他情况也是如此。

不过,这是否是您真正想做的事情是一个问题;-)

于 2012-11-30T22:45:00.567 回答