【发布时间】:2019-06-28 08:47:58
【问题描述】:
我有一个表(比如说'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;
结束;
这里在更新语句@MyField 给出错误:“必须声明表变量@MyField”。
【问题讨论】:
-
你必须使用set而不是Update,因为@MyField是一个变量
-
您不能参数化对象名称。在这种情况下,您将需要使用动态 sql。并忽略可疑路径,使用描述性和相关的变量名称。 MyField 不是字段或列,它是表的名称。并保持一致!你终止了一些语句,但不是全部?
-
而且您不需要两个游标 - 使用一个游标将同样
高效。
标签: sql-server tsql sql-update dynamic-sql