2010-08-16 78 views
2

在我的存儲過程中,我創建了一個temp_tbl並希望在遊標或while循環中添加多個列。一切工作正常光標(一temp_bl的創造,而是當列字符串是在一個varchar可變我不能添加列包含表名和列名變量的DDL語句

WHILE @@FETCH_STATUS = 0 
BEGIN  
SET @webadressenrow = 'Webadresse_'+CAST(@counter as nchar(10)) 

    ALTER TABLE IVS.tmpBus 
     ADD @webadressenrow varchar(500) Null 

    fetch next from cur_web into @webadressen 
    SET @counter = @counter + 1 
END 

上述語法錯誤結果的代碼,而該代碼的工作:

WHILE @@FETCH_STATUS = 0 
BEGIN  
SET @webadressenrow = 'Webadresse_'+CAST(@counter as nchar(10)) 

    ALTER TABLE IVS.tmpBus 
    ADD SOMECOLUMNAME varchar(500) Null 

    fetch next from cur_web into @webadressen 
    SET @counter = @counter + 1 
END 

任何人都可以給我一個語法提示這個小問題?

+2

您正處於想要動態生成alter table語句的情況,這表明您的設計有問題。看起來您正在添加多列來存放網址,您應該將其抽取到另一個表格中。 – 2010-08-16 17:37:48

回答

0

一般來說DDL語句,即那些定義表和列不接受表或列名的變量。

有時你可以通過準備語句來解決這個問題,但所有數據庫引擎都不提供對準備好的DDL的支持。

以下示例在SQL Server 2005中,雖然我會建議動態添加列可能不是最佳的解決方案

DECLARE @colname1 VARCHAR(10) 
DECLARE @colname2 VARCHAR(10) 
DECLARE @sql VARCHAR(MAX) 

SET @colname1 = 'col1' 
SET @colname2 = 'col2' 

SET @sql = 'CREATE TABLE temptab (' + @colname1 + ' VARCHAR(10))' 

EXEC (@sql) 

INSERT INTO temptab VALUES ('COl 1') 


SET @sql = 'ALTER TABLE temptab ADD ' + @colname2 + ' VARCHAR(10)' 

EXEC (@sql) 

INSERT INTO temptab VALUES ('Col1', 'Col2') 

SELECT * FROM temptab 

DROP TABLE temptab 

產生以下結果

 
col1  col2 
---------- ---------- 
COl 1  NULL 
Col1  Col2 
2

你不會能夠參數化ALTER TABLE聲明,但您可以建立SQL並執行如下所示的操作:

declare @sql nvarchar(max) 
set @sql = 'create table IVS.tmpBus (' 

select 
    @sql = @sql + 'Webadresse_' + 
     row_number() over (order by col) + 
     ' varchar(500) null, ' 
from sourceData 

set @sql = substring(@sql, 1, len(@sql) - 2) + ')' 
exec @sql 

雖然要小心安全/ SQL注入攻擊。

0

我已經解決了非最佳方式的問題。該代碼適用於我。我希望另一個沮喪的程序員可以使用這個。

DECLARE cur_web CURSOR FOR 
SELECT IVS.LG_Webadressen.Adresse FROM IVS.LG_Webadressen WHERE IVS.LG_Webadressen.FK_GID = @welche 

open cur_web /*Cursor wird geöffnet*/ 
fetch next from cur_web into @webadressen /*Erster Datensatz wird geholt*/ 

WHILE @@FETCH_STATUS = 0 /*Solange eine Datensatz vorhanden ist*/ 
BEGIN  
/*Spalte Adden*/ 
SET @webadressenrow = 'Webadresse_'+CAST(@counter as nchar(1)) /*Anhängen des  Durchlaufes an den Spaltennamen*/ 
SET @sql = 'ALTER TABLE IVS.temp_tbl ADD ' + @webadressenrow + ' VARCHAR(100)' /*Spalte adden*/ 
EXEC (@sql)  
/*Wert für die Webadresse wird reingeschrieben*/ 
SET @sql = 'UPDATE IVS.temp_tbl Set ' + @webadressenrow + ' = ''' + @webadressen + ''' WHERE GID = ' + CAST(@welche as nchar(10)) + '' 
EXEC(@sql) 
/*nächtser Datensatz wird geholt*/ 
fetch next from cur_web into @webadressen 
SET @counter = @counter + 1 
END 
/*Cursor zerstören und Schließen*/ 
CLOSE cur_web 
DEALLOCATE cur_web