【问题标题】:SQL Procedure CREATE Table with variable TablenameSQL 过程用变量表名创建表
【发布时间】:2016-03-12 12:33:14
【问题描述】:

我需要用变量名创建表。

这是我的代码,我不知道为什么它不起作用。

BEGIN
  SET @tablename = tablename;
  SET @sql_text = concat('CREATE TABLE ',@tablename,' (ID INT(11) NOT NULL, team0 DOUBLE NOT NULL, team1 DOUBLE NOT NULL)');

  PREPARE stmt FROM @sql_text;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END

这是错误:

程序执行失败

1054 - “字段列表”中的未知列“TestTableName”

【问题讨论】:

    标签: mysql sql procedure


    【解决方案1】:

    ' 包裹tablename 以表明它是字符串文字而不是标识符。

    BEGIN
      SET @tablename = 'tablename';
      SET @sql_text = concat('CREATE TABLE ',@tablename,' (ID INT(11) NOT NULL, team0 DOUBLE NOT NULL, team1 DOUBLE NOT NULL)');
    
      PREPARE stmt FROM @sql_text;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END
    

    SqlFiddleDemo

    请阅读CREATE TABLE @tbl,因为在运行时创建表可能表明设计不佳。

    【讨论】:

      【解决方案2】:
      BEGIN
        SET @tablename = 'tablename';
        SET @sql_text = concat('CREATE TABLE ',@tablename,' (ID INT(11) NOT NULL, team0 DOUBLE NOT NULL, team1 DOUBLE NOT NULL)');
      
        PREPARE stmt FROM @sql_text;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
      END
      

      【讨论】:

        【解决方案3】:

        显然问题在于表名本身和缺少引号(正如其他人所指出的)。在编写此类代码时,您可能会考虑使用replace() 而不是concat()。这使您可以:

        BEGIN
          SET @tablename = 'tablename';
          SET @sql_text = '
        CREATE TABLE @tablename (
            ID INT(11) NOT NULL,
            team0 DOUBLE NOT NULL,
            team1 DOUBLE NOT NULL
        )';
        
          REPLACE(@sql_text, '@tablename', @tablename);
        
          PREPARE stmt FROM @sql_text;
          EXECUTE stmt;
          DEALLOCATE PREPARE stmt;
        END
        

        我发现这种方法更容易调试和维护。

        【讨论】:

        • 不应该是SET @sql_text = REPLACE(@sql_text, '@tablename', @tablename);吗?没有SET,原始变量将不受影响+您需要指出它是带有@的变量(可能是错字)。
        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 2015-06-20
        • 2015-05-28
        • 1970-01-01
        相关资源
        最近更新 更多