2017-04-06 348 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' 

您可以將其存儲在一個變量,並相應地使用它。

我希望你明白:)