如何:构建表时自动命名列

时间:2019-04-18 20:37:54

标签: sql-server tsql

我看到了一些似乎很接近我的解决方案的答案,但是他们使用了代码,如果可以的话,我宁愿在SQL中执行此操作。我大致知道需要什么,但是我从未见过有人在SQL中这样做过。我正在建立一个表,但是我不想手动设置每个列的名称。结构将类似于以下内容:

ID - BIGINT - Primary Key - Seed Increment 1 start at 1
Email - NVARCHAR(500) do not allow null
Board_Name - NVARCHAR(100) - Do not allow null 
Tile_1 - BIT - Do Not Allow Null
Tile_2 - BIT - Do Not Allow Null
Tile_3 - BIT - Do Not Allow Null
Tile_4 - BIT - Do Not Allow Null
Tile_5 - BIT - Do Not Allow Null
Tile_6 - BIT - Do Not Allow Null
Tile_7 - BIT - Do Not Allow Null
Tile_8 - BIT - Do Not Allow Null
Tile_9 - BIT - Do Not Allow Null
Tile_10 - BIT - Do Not Allow Null

表“ Tile_X”我需要做348次。所以显然我不想做348次。

 DECLARE @X INT

 SET @X = 1

 WHILE (@X <=348)
 BEGIN
     PRINT @X
     SET @X = @X + 1

     ALTER TABLE [dbo].[Game_Board]
     ADD 'Tile_' + @X BIT NOT NULL;
 END
 GO

给出错误:

  

第15级州立1行11的消息102
  'Tile_'附近的语法不正确。

更新: 我已经建立了表格,但是还没有添加Tile列。因此,我需要弄清楚如何修复此循环以使其添加它们。

更新: 还尝试了这个:

DECLARE @X INT
DECLARE @Column NVARCHAR(100)

SET @X = 1
SET @Column = 'Tile_' + @X

WHILE (@X <=348)
BEGIN
    PRINT @X    

    ALTER TABLE [dbo].[Game_Board]
    ADD @Column BIT NOT NULL;

    SET @X = @X + 1
    SET @Column = 'Tile_' + @X
END
GO

获取错误:

  

第15级州立1行12的消息102
  “ @Column”附近的语法不正确。

1 个答案:

答案 0 :(得分:1)

您应该使用动态T-SQL,如下面的代码所示

DECLARE @X INT;
DECLARE @Column NVARCHAR(100);
SET @X = 1;
SET @Column = 'Tile_' + CAST(@X AS NVARCHAR(3));
DECLARE @tsql AS NVARCHAR(MAX)= '';
WHILE(@X <= 348)
    BEGIN
        SET @tsql = @tsql + ' ALTER TABLE [dbo].[Game_Board] '
        SET @tsql = @tsql + ' ADD ' + @Column + ' BIT NOT NULL;';
        SET @X = @X + 1;
        SET @Column = 'Tile_' + CAST(@X AS NVARCHAR(3));
    END;
--PRINT @tsql
EXEC sys.sp_executesql 
    @tsql;
GO

另请参阅sp_executesql (Transact-SQL)