【问题标题】:How to update a local table variable using dynamically generated column name?如何使用动态生成的列名更新本地表变量?
【发布时间】:2016-03-24 21:43:37
【问题描述】:

我有一些汇总数据:

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

我得到的错误

必须声明表变量“@table”。

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

我该如何解决?

【问题讨论】:

  • 改用临时表就行了。
  • 将表变量传入/传出动态 SQL 语句可能很棘手。这里的问题是动态 SQL 在不同的上下文中执行。这个question 展示了如何解决这个问题。
  • 本地临时表 #temp 将完成这项工作
  • 您创建了#table 吗?将您的 declare @table 行更改为 create table #table
  • 您可以发布您的查询吗?

标签: sql-server tsql dynamic-sql


【解决方案1】:

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

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;

【讨论】:

  • 抱歉,我没有看到必须将表声明为@table
  • 这不是必须的,这只是我尝试的方式。看起来全局临时表对我有用
猜你喜欢
  • 2012-06-04
  • 2012-10-28
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多