【问题标题】:how to use variable name as table name in update statement如何在更新语句中使用变量名作为表名
【发布时间】: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


【解决方案1】:

您的方法很好,但您不能在表名位置上使用变量,您需要在变量中构建更新命令,然后执行动态 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)

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 2021-06-25
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多