2

在我的存储过程中,我创建了一个temp_tbl并想在游标或 while 循环中添加几列。游标一切正常(创建 atemp_bl但当列字符串位于 varchar 变量中时我无法添加列。

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

谁能给我这个小问题的语法提示?

4

3 回答 3

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 注入攻击。

于 2010-08-16T17:19:24.740 回答
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
于 2010-08-18T07:48:03.357 回答
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 空
Col1 Col2
于 2010-08-16T17:14:18.513 回答