我看到了一些似乎很接近我的解决方案的答案,但是他们使用了代码,如果可以的话,我宁愿在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”附近的语法不正确。
答案 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