如何有条件地为SQL CREATE TABLE语句构造表名?

时间:2010-11-08 04:35:36

标签: sql mysql sql-server oracle informix

在SQL存储过程中,我希望能够构造表名并创建它。

示例:我刚刚登录公司03下的数据库并且客户表不存在,所以我希望将proc发送到CREATE TABLE CUSTOMER03

有没有办法append company_id char(2)CUSTOMER并将其提供给CREATE TABLE声明?也许像

CREATE TABLE $tablename or $tablename+company_id?

3 个答案:

答案 0 :(得分:9)

在Oracle中,语法类似于

BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE CUSTOMER_'||v_company_id||' (..)';
END;

然而,这可能是一个非常糟糕的主意。在线下六个月后,您需要在表格中添加一列,然后您需要确定需要将哪些表格添加到表格中。

此外,Oracle中的存储过程需要一个固定的表名(现有表),或者您必须通过动态SQL引用所有内容,这很痛苦。

最好有一个customer_id作为属性的单个customer表。然后使用Fine Grained Access Control安全地过滤company_id,以控制谁看到公司的数据。

答案 1 :(得分:2)

IF NOT EXISTS修饰符用于CREATE TABLE语句。这将导致仅在表尚不存在时才创建表。

答案 2 :(得分:2)

您需要使用动态SQL,例如:

DECLARE @company_id char(2)
SET @company_id = '02'
EXEC('CREATE TABLE CUSTOMER' + @company_id + ' (id int PRIMARY KEY)')

(测试)