2012-11-30 5 views
0

작동하는 저장 프로 시저가 있지만 하이픈이있는 값을 전달하면 오류가 발생합니다.값이 하이픈 인 MySQL 저장 프로 시저

나는 call create ('server-v01', 555)와 같은 값으로 내 프로 시저를 호출한다. 다음과 같은 오류가 발생합니다 :

ERROR 1064 (42000) : SQL 구문에 오류가 있습니다. 라인에 가까운 '-v01'를 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인 한

내 절차는 다음과 같다 :

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 ; 

내 문제는 내가 처리 할 수있는 방법이다 변수에 하이픈이 포함되어 있습니까?

답변

2

귀하의 질문은 대시로 변수를 처리하는 방법이 아니라 대시가있는 테이블을 처리하는 방법입니다. 프로시 저는 tname에 지정된 이름의 테이블을 작성하려고 시도합니다. 이런 식으로 표를 만들거나 떨어 뜨리려면 백틱으로 인용해야합니다.

DROP TABLE IF EXISTS `server-01`; 

은 특히 당신은

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

및 다른 인스턴스에 대해 동일해야합니다.

이것이 실제로하고 싶은지 여부는 질문입니다. ;-)

+0

그게 효과가 있습니다. 고맙습니다. 내 테이블 이름에 hypens를 사용하는 것이 가장 좋은 아이디어는 아니지만 당분간해야 할 일입니다. 다시 한번 감사드립니다. –

+0

여러분을 환영합니다. –