Sql server 如何使用动态生成的列名更新本地表变量?

Sql server 如何使用动态生成的列名更新本地表变量?,sql-server,tsql,dynamic-sql,Sql Server,Tsql,Dynamic Sql,我有一些汇总数据: name asd colA ColB ColC X Y ----------------------------------------------- ... George PJ Sp P B 14.8 56 George PJ Sp P C 11.4 43 ... --------------------------------------------

我有一些汇总数据:

name   asd  colA   ColB    ColC      X      Y
-----------------------------------------------
...
George  PJ  Sp      P       B       14.8    56
George  PJ  Sp      P       C       11.4    43
...
-----------------------------------------------
和一个本地结果表

declare @result table(
    Name nvarchar(255),
    SP_E_A int null,
    SP_E_B int null,
    SP_E_C int null,
    SP_E_D int null,
    SP_E_viso decimal(5,1) null,
    ...
    --LOTS MORE COLUMN GOES AFTER
    ...
)
它有很多列

我想做的是: 动态生成update语句并执行它
例如:

所以我写了这个

open cursor for *that result set*
declare @sql varchar(255) = 'UPDATE @table SET '+@colA+'_'+@colB+'_'+@colC+'='+CONVERT(varchar,@Y);
exec (@sql)
我犯了一个错误

必须声明表变量“@table”

看起来exec启动了另一个@result table不存在的会话


如何解决此问题?

您可以尝试使用全局临时表,如下代码所示:

CREATE TABLE ##globalSession ( column1 int null, column2 varchar(45) null);

INSERT INTO ##globalSession (column1, column2) Values (2, 'initial data');

declare @sql VARCHAR(255) = 'UPDATE ##globalSession set column1 = 1, column2 = ''test'' ; ';

exec (@sql)

SELECT * FROM ##globalSession

DROP TABLE ##globalSession;

您可以尝试使用全局临时表,如下代码所示:

CREATE TABLE ##globalSession ( column1 int null, column2 varchar(45) null);

INSERT INTO ##globalSession (column1, column2) Values (2, 'initial data');

declare @sql VARCHAR(255) = 'UPDATE ##globalSession set column1 = 1, column2 = ''test'' ; ';

exec (@sql)

SELECT * FROM ##globalSession

DROP TABLE ##globalSession;

只需更改为使用临时表。将表变量传入/传出动态SQL语句可能很棘手。这里的问题是动态SQL在不同的上下文中执行。这显示了如何解决此问题。本地临时表
#temp
将完成此工作。您是否创建了
#表
?将您的
declare@table
行更改为
create table#table
可以发布查询吗?只需更改为使用临时表即可。将表变量传入/传出动态SQL语句可能会很棘手。这里的问题是动态SQL在不同的上下文中执行。这显示了如何解决此问题。本地临时表
#temp
将完成此工作。您是否创建了
#表
?将您的
declare@table
行更改为
create table#table
可以发布您的查询吗?抱歉,我没有看到必须将表声明为@table这不是必须的,这只是我尝试的方式。看起来全局临时表将适用于meSorry,我没有看到必须将表声明为@tableIt不是必须的,这只是我尝试的方式。看来全局临时表适合我