1

我在更新语句中引用表变量时遇到问题。似乎我不能使用该@a.id列(编译器说它没有声明)。

下面的例子只是为了说明问题而写的,意思是我知道我可以解决当前示例中重命名列 id 并避免@a.id引用的问题,但这不是一个选项,我真的做不到。我看到一些解决方案使用 from 语句为正在更新的表设置别名,但在此示例中,我将 from 语句用于其他内容。有没有其他方法可以解决它?

declare @a table
(
    id int not null,
    name varchar(100) null
)

insert into @a (id, name) values (1, null)
insert into @a (id, name) values (2, null)
insert into @a (id, name) values (3, null)

declare @b table
(
    id int not null,
    name varchar(100) null
)

insert into @b (id, name) values (1, 'one')
insert into @b (id, name) values (2, 'two')

update @a
set
    name = f.name
from
(
    select
        id,
        name
    from @b
    where
        id = @a.id
) f
where
    @a.id = f.id
4

2 回答 2

1

尝试这样的事情:

declare @a table 
( 
    id int not null, 
    name varchar(100) null 
) 

insert into @a (id, name) values (1, null) 
insert into @a (id, name) values (2, null) 
insert into @a (id, name) values (3, null) 

declare @b table 
( 
    id int not null, 
    name varchar(100) null 
) 

insert into @b (id, name) values (1, 'one') 
insert into @b (id, name) values (2, 'two') 

update upd
set 
    name = [@b].name 
from @a AS upd
INNER JOIN @b
    ON upd.id = [@b].id

顺便说一句,以下也将起作用:

update @a 
set 
    name = f.name 
from 
( 
    select 
        id, 
        name 
    from @b 
) f 
where 
    [@a].id = f.id 
于 2012-09-04T19:43:17.103 回答
0

对@a.id 的引用是非法的,因为此时该表超出了范围。您可以尝试以下方法:

Update @a
  set name = f.name
  from @b g
  join @a f
    on g.id=f.id
于 2012-09-04T19:44:04.247 回答