引用表变量

时间:2012-09-04 19:31:42

标签: sql sql-server

我在更新语句中引用表变量时遇到问题。似乎我无法使用@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

2 个答案:

答案 0 :(得分: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

以下BTW也会奏效:

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

答案 1 :(得分:0)

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

Update @a
  set name = f.name
  from @b g
  join @a f
    on g.id=f.id