2012-09-04 45 views
1

我有更新語句中引用表變量的問題。似乎我不能使用@a.id列(編譯器說它沒有聲明)。引用表變量

下面的例子只是爲了說明問題,這意味着我知道我可以在當前的例子中解決問題,重命名列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 
+1

您的第二套插入語句應放入@b? – Beth

+2

究竟是什麼問題?你的問題是什麼? – LittleBobbyTables

+0

在@b聲明下面的兩個INSERT語句是否真的應該引用@b?也就是說,所有五個插入都進入了@a,而沒有進入@b,但是看起來第二個組真的需要去@b .... –

回答

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 
0

到@ a.id的引用是非法的,因爲該表是超出範圍的那一點。以下是您可能嘗試的操作:

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