1

毎月、300 以上の列を含む CSV ファイルを取得します。ファイルのレイアウトはいつでも変更でき、列は追加/削除できます。必要な正確な数の列を含む動的テーブルを作成する方法が必要です。列名は気にしません。Column1、Column2 などにすることができます。すべての型を Varchar(500) に設定する予定です。

理想的には、私が達成したいのは、必要な列の数を渡すだけでループして必要なテーブル定義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;

それに近いものが欲しいのですが、本当に必要なのは、任意の数の列を持つテーブルを作成する機能だけです。

ありがとう!

4

1 に答える 1

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, ')');
...

この場合、姓の後にコンマが追加さ、結果の文字列内のすべてのコンマが前の例のように置き換えられます。リストの最後の仕上げとして、末尾のコンマが削除され、最終的に完全なステートメントが作成されます。

いずれにせよ、ループは必要ありません。

于 2012-10-23T22:47:43.253 に答える