在我的存储过程中,我创建了一个temp_tbl
,并希望在游标或while循环中添加几个列。一切正常工作(创建temp_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
有人能给我一个语法暗示这个小问题吗?
答案 0 :(得分: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注入攻击。
答案 1 :(得分: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 :(得分: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