如何在更新语句中使用变量名作为表名

时间:2019-06-28 08:47:58

标签: sql-server tsql sql-update dynamic-sql

我有一个表(比如说'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”。

1 个答案:

答案 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)