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 回答