2017-04-06 133 views
0

是否有任何方法将可变数量的列添加到表中。sql添加变量名称列

我想下面但没有成功。

DECLARE @VAR INT = 1 
WHILE @VAR <=20 
BEGIN 
    DECLARE @COLUMN VARCHAR(MAX) = 'COLUMN_'+CAST(@VAR AS VARCHAR) 
    IF NOT EXISTS(SELECT 1 FROM SYS.columns WHERE OBJECT_ID = OBJECT_ID('MY_TBL') AND [email protected]) 
     begin 
     ALTER TABLE MY_TBL ADD @COLUMN NVARCHAR(3) NULL; 
     end 
    SET @VAR += 1 
END 
+4

这是一个真的* *坏表的设计。为什么要将* data *嵌入* metadata *(列名)中。这也会导致令人费解和困惑的查询。表示相同“类型”数据的重复组的*标准*方式是多行*行数据。 –

+1

这是糟糕的设计。如果您有许多具有相同类型数据的列,请改为多行。那就是他们的用途。 – Magisch

+1

总结与以前的家伙在这里。这是一个糟糕的设计。 –

回答

1

您需要使用动态SQL。 请尝试下面的代码。

DECLARE @VAR INT = 1 
WHILE @VAR <=20 
BEGIN 
    DECLARE @COLUMN VARCHAR(MAX) = 'COLUMN_'+CAST(@VAR AS VARCHAR) 
    IF NOT EXISTS(SELECT 1 FROM SYS.columns WHERE OBJECT_ID = OBJECT_ID('MY_TBL') AND [email protected]) 
     begin 
     declare @sql varchar(100)= ' ALTER TABLE MY_TBL ADD '[email protected]+' NVARCHAR(3) NULL;' 
     exec(@sql); 
     end 
    SET @VAR += 1 
END 
0

对于SQL-服务器:

格式:

SELECT COUNT(*) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_CATALOG = 'database' AND TABLE_SCHEMA = 'dbo' 
AND TABLE_NAME = 'table' 

例子:

SELECT COUNT(*) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_CATALOG = 'imDB' AND TABLE_SCHEMA = 'dbo' 
AND TABLE_NAME = 'MovieName' 

您可以将其存储在一个变量,并相应地使用它。

我希望你明白:)