-1

If I make a table variable here:

declare @Table Table (ProductID int, Color = varchar(60))

Then populate it of course, and try to use it in an Update with Join statement like below, I get errors.

UPDATE [Product]
    SET [Product].[Active] = 1                      
    ,[Product].[Color] = t.[Color]
    INNER JOIN @Table t 
    ON t.[ProductID] = [Product].[ProductID]

Error:

 Msg 156, Level 15, State 1, Procedure
 Incorrect syntax near the keyword 'INNER'.

Any suggestions how to do this?

Control Freak
  • 12,965
  • 30
  • 94
  • 145

1 Answers1

3

You can also do this (works on SQL Server and all ANSI SQL conforming database):

UPDATE [Product] SET 
    [Product].[Active] = 1                      
    ,[Product].[Color] = t.[Color]
FROM @Table t 
WHERE t.[ProductID] = [Product].[ProductID]

There's something to be desired from SQL Server's proprietary UPDATE FROM though, you can easily change the UPDATE statement to make it match whole table regardless if there's no matching rows.

It's easy to fashion this matched-rows-only update... http://www.sqlfiddle.com/#!3/8b5a3/26

update p SET
  Qty = t.Qty
from Product p
inner join Latest t 
on t.ProductId = p.ProductId;

...to an UPDATE that matches all rows, you merely change the INNER JOIN to LEFT JOIN: http://www.sqlfiddle.com/#!3/8b5a3/27

update p SET
  Qty = ISNULL(t.Qty,0)
from Product p
left join Latest t 
on t.ProductId = p.ProductId;


select * from Product;

Whereas if you want to fashion the ANSI SQL UPDATE with matched-rows-only ... http://www.sqlfiddle.com/#!3/8b5a3/28

update Product SET
  Qty = t.Qty
from Latest t
where t.ProductId = Product.ProductId

...to UPDATE statement that matches all rows, you have to adjust your query a bit: http://www.sqlfiddle.com/#!3/8b5a3/29

update Product SET
  Qty = ISNULL(t.Qty, 0)
from 
(
  select x.ProductId, lat.Qty
  from Product x
  left join Latest lat on lat.ProductId = x.ProductId
) as t  
where t.ProductId = Product.ProductId;

Though as most choices in development, one should weigh the pros and cons in terms of code readability/maintainability against flexibility

Data sample:

create table Product
(
  ProductId int primary key not null,
  Name varchar(50) not null,
  Qty int not null
  );


insert into Product(Name,Qty) values
(1,'CAR',1),
(2,'Computer',1000),
(3,'Shoes',2);


create table Latest
(
  ProductId int primary key not null,
  Qty int not null
);

insert into Latest(ProductId, Qty) values
(2,2000),
(3,3);
Michael Buen
  • 38,643
  • 9
  • 94
  • 118