2012-10-23 5 views
1

매월 300 개 이상의 열을 포함하는 CSV 파일이 생성됩니다. 파일의 레이아웃은 언제든지 변경 될 수 있으며 열은 추가/제거 될 수 있습니다. 필자는 정확한 열 수를 포함하는 동적 테이블을 만드는 방법이 필요합니다. 난 열 이름에 상관 없어요, 그들은 Column1, Column2, 등 수 있습니다. 그리고 Varchar (500) 모든 유형을 설정할 계획이다.MySQL 동적 테이블 문제

이상적으로 내가 원하는 것은 단순히 필요한 열의 수를 전달할 수있는 저장 프로 시저이며 필요한 테이블 정의 sql을 작성한 다음 해당 SQL을 실행하도록 반복합니다.

심지어 이렇게 할 수 있습니까? 나는 다음을 쓰기 시작했다 : 나는에 가까운 뭔가를하고 싶지만 내가 정말 필요로하는 모든 컬럼의 특정 번호로 테이블을 생성 할 수있는 기능입니다

BEGIN 
Declare loopvar int default 1; 
Declare tsql VarChar(5000); 
Declare table_definition VarChar(8000); 
Declare tablename varchar(20); 
Set table_definition = 'Column'; 
set tablename = 'npi_data'; 
Set loopvar = 1; 
While loopVar < 362 DO 
    set tsql = table_definition + loopvar + 'varchar(500) DEFAULT NULL' ; 
    set loopvar = loopvar + 1; 
end while; 
set tsql = 'CREATE TABLE' + tablename + '(' + tsql + ') ENGINE=InnoDB DEFAULT CHARSET=utf8'; 
execute tsql; 
END; 

.

감사합니다.

+0

Column1과 Column2라는 열을 사용하는 것이 좋습니다. 각 열 이름이 쉼표로 구분되는 일부'@tableColumns VARCHAR (8000)'매개 변수를 사용하지 않으시겠습니까? –

답변

0

'A,B,C'과 같은 열 이름 목록을 전달하고이를 사용하여 A varchar(500) DEFAULT NULL,B varchar(500) DEFAULT NULL,C varchar(500) DEFAULT NULL과 같은 열 정의 목록을 생성하고 결국 해당 정의 목록이있는 CREATE TABLE 문을 사용하면 쉼표 앞 컬럼의 정의를 완료 할 수 있도록

입니다
... 
SET columnnames = 'A,B,C'; 
SET sql = CONCAT(
    REPLACE(columnnames, ',', ' varchar(500) DEFAULT NULL,'), 
    ' varchar(500) DEFAULT NULL' 
); 
SET sql = CONCAT('CREATE TABLE ', tablename, ' (', sql, ')'); 
... 

이름 목록에서 모든 쉼표 확장이 같은 방법을 사용할 수 있습니다. 마지막 항목에 쉼표가 오지 않으므로 유형은 단순히 더 연결되어 REPLACE의 결과가됩니다.

또는, varchar(500) DEFAULT NULL 비트의 반복을 피하기 위해이 작업을 수행 할 수 있습니다 :

... 
SET columnnames = 'A,B,C'; 
SET sql = REPLACE(CONCAT(columnnames, ','), ',', ' varchar(500) DEFAULT NULL,'); 
SET sql = LEFT(sql, LENGTH(sql) - 1); 
SET sql = CONCAT('CREATE TABLE ', tablename, ' (', sql, ')'); 
... 

를이 경우, 쉼표는 결과 문자열의 마지막 이름 뒤에 다음 모든 쉼표입니다 추가 이전 예와 같이 바뀌 었습니다. 목록에 마지막으로 터치하면 쉼표가 제거되고 마침내 완전한 문이 작성됩니다.

어느 쪽이든, 루프가 필요하지 않습니다.

+0

컬럼의 수는 동적 인 파트입니다. 그래서 각각의 정의를 작성하는 가능한 컬럼 수를 반복하려면 루프가 필요합니다. 필자는 열 이름 목록을 전달할 수 없으며 파일을 열고 매주 300 개 이상의 열 이름을 입력 할 시간이 없습니다. – Encryption