2012-12-16 3 views
2

난 당신이 생각을MySQL 변수를 사용하여 테이블의 이름을 지정할 수 있습니까?

2012_10_15_ncvoter68 
2012_11_15_ncvoter68 
2012_12_15_ncvoter68 

같은 다른 이름으로 테이블의 무리를 유지하기 위해 저를 필요로하는 워크 플로우를 가지고있다.

방금 ​​테이블 2012_12_15_ncvoter68을 만들었습니다.

변수를 사용하여이 테이블을 쿼리하고 싶습니다.

SET @dt_ncv = CONCAT((SELECT DATE_FORMAT(CURDATE(), '%Y_%m_%d')),"_ncvoter68"); 

변수 @dt_ncv 문자열 2012_12_15_ncvoter68 평가 : 예를 들면, 나는 변수를 정의 할 수 있습니다.

그러나이 변수를 사용하여 테이블을 참조하는 방법 (또는 가능한 경우)을 파악할 수 없습니다.

쿼리 :

SELECT count(*) FROM @dt_ncv; 

단순히 SQL 구문 오류를 제공합니다.

나는 준비된 문장으로 놀려고했지만 그게 도움이되지 않았다.

여러분 중 일부는 MySQL 전문가가 도와 줄 수 있기를 바랍니다.

+2

매월 다른 테이블을 사용하면 디자인이 좋지 않습니다. 왜 단 하나의 날짜 열이있는 테이블이 없습니까? –

+1

semi dupe, 동일한 해결책 http://stackoverflow.com/questions/8363415/why-cant-i-use-a-variable-as-the-table-name-in-a-stored-procedure/8363487#8363487 – goat

답변

2

아니요, 그렇게 할 수 없습니다.

절차 대체 언어에서 변수 대체를 처리해야합니다.

설명서가 말한대로 (http://dev.mysql.com/doc/refman/5.1/en/user-variables.html)

사용자 변수는 데이터 값을 제공하기위한 것입니다. 테이블 또는 데이터베이스 이름이 인 컨텍스트에서 또는 SELECT와 같은 예약어와 같이 식별자로 SQL 문에서 직접 사용되거나 식별자의 일부로 사용되는 일 수 없습니다.

내 옛 MySQL의 노트를보고 그것을 할 수있는 방법을 발견
+1

준비된 명령문을 사용하여 동적 SQL을 사용하여 sql에서 변수 대체를 수행하여 문자열의 실행을 재촉 할 수 있습니다. – goat

2

: 그것은 꽤 아니다하고 간결 아니다

SET @dt_ncv = CONCAT((SELECT DATE_FORMAT(CURDATE(), '%Y_%m_%d')),"_ncvoter68"); 
SET @cntstmt = CONCAT_WS(" ", "SELECT count(*) FROM",@dt_ncv); 
PREPARE ncv_count_stmt FROM @cntstmt; 
EXECUTE ncv_count_stmt; 

을하지만, 그것을 작동합니다!

+0

나는 그다지 귀엽지 않다는 것에 동의하며, 데이터 테이블에 날짜 (또는 월)를 만든 경우에는 필요하지 않습니다. 약간의 리펙토링과 훨씬 더 쉽게 디자인을 사용할 수 있습니다. –

관련 문제