我有一个表(比如说'A'),其中包含数据库中所有表的列表。我定义了一个游标,该游标遍历'A'中的表名。我想更新在中定义的表列一个光标。
我创建了2个游标,一个游标遍历表名,另一个游标遍历列名。
DECLARE @MyCursor CURSOR;
DECLARE @MyField nvarchar(255);
BEGIN
SET @MyCursor = CURSOR FOR
select distinct Table_name from DataTable where Data <>'No'
set @a=0
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @column_cursor CURSOR;
DECLARE @columnField nvarchar(255);
SET @column_cursor = CURSOR FOR
select Column_name from DataTable where TABLE_NAME=@MyField and Data
<>'No'
OPEN @column_cursor
FETCH NEXT FROM @column_cursor
INTO @columnField
WHILE @@FETCH_STATUS = 0
BEGIN
update @MyField set @columnField=''+@MyField+'_'+@columnField+@a
FETCH NEXT FROM @column_cursor
INTO @columnField
END;
CLOSE @column_cursor ;
DEALLOCATE @column_cursor;
FETCH NEXT FROM @MyCursor
INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
在更新语句@MyField中出现错误:“必须声明表变量@MyField”。
答案 0 :(得分:0)
您的方法很好,但是不能在表名上使用变量,您需要在变量中构建update命令,然后执行动态sql。 您可以看到:Creating a dynamic sql query
在您的情况下类似
declare @sqlCommand varchar(max)
declare @MyField varchar(255) = 'table_name'
declare @columnField varchar(255) = 'column_NAME'
declare @columnValue varchar(255) = 'column_value'
set @sqlCommand = 'update '+ @MyField +' set '+@columnField+' = ' +@columnValue+ ' where 1=1;'
--select @sqlCommand
EXEC (@sqlCommand)