如何使用动态生成的列名更新本地 table 变量?
How to update a local table variable using dynamically generated column name?
我有一些汇总数据:
name asd colA ColB ColC X Y
-----------------------------------------------
...
George PJ Sp P B 14.8 56
George PJ Sp P C 11.4 43
...
-----------------------------------------------
和本地结果table
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 TABLE @table SET SP_P_B = 56
所以我写了这个
open cursor for *that result set*
declare @sql varchar(255) = 'UPDATE @table SET '+@colA+'_'+@colB+'_'+@colC+'='+CONVERT(varchar,@Y);
exec (@sql)
我得到的错误
Must declare the table variable "@table".
看起来 exec 启动了另一个会话,其中 @result table 不存在。
我该如何解决?
您可以尝试使用全局临时 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;
我有一些汇总数据:
name asd colA ColB ColC X Y
-----------------------------------------------
...
George PJ Sp P B 14.8 56
George PJ Sp P C 11.4 43
...
-----------------------------------------------
和本地结果table
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 TABLE @table SET SP_P_B = 56
所以我写了这个
open cursor for *that result set*
declare @sql varchar(255) = 'UPDATE @table SET '+@colA+'_'+@colB+'_'+@colC+'='+CONVERT(varchar,@Y);
exec (@sql)
我得到的错误
Must declare the table variable "@table".
看起来 exec 启动了另一个会话,其中 @result table 不存在。
我该如何解决?
您可以尝试使用全局临时 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;