2012-01-23 142 views
0

我有一堆列的临时表变量:更新一个表从另一个表中的SQL Server 2008

Declare @GearTemp table 
    (
     ItemNumber varchar(20), 
     VendorNumber varchar(6), 
     ItemStatus varchar(20), 
     Style varchar(20), 
     ItemName varchar(100), 
     ItemDescription varchar(1000), 
     Color varchar(50), 
     [Size] varchar(50), 
     ItemCost decimal(9,4), 
     IsQuickShipFl bit, 
     IsEmbroiderable bit, 
     IsBackOrderable bit, 
     LoadDate smalldatetime 
    ) 

它得到通过的INSERT语句填充数据从另一个表,我想利用该数据并更新我的产品表。如果可能的话,我愿做这样的事情:

Update Products blah blah blah all columns where itemnumbers match up 
SELECT * FROM @GearTemp FT 
WHERE EXISTS (SELECT P.ItemNumber FROM Products P WHERE FT.ItemNumber = P.ItemNumber) 

那是可能的吗?如果不是,请指出我的方向。

+0

能有一个以上的纪录@GearTemp对于任何给定产品的记录?在这种情况下你想发生什么? – mwigdahl

+0

Itemnumber是主键,所以这些数字将是唯一的。这是你问的吗? – broke

+0

ItemNumber是Products _and_ @GearTemp的主键?我想知道是否可以在@GearTemp中为给定的ItemNumber存在多个条目。如果是这样,你想如何处理? – mwigdahl

回答

4

如果我理解正确的话,你可以使用这样的事情:

UPDATE p SET X = gt.X, Y = gt.Y -- etc... (not sure whether your column names match up) 
FROM Products p 
    INNER JOIN @GearTemp gt ON p.ItemNumber = gt.ItemNumber 

注意的是,如果你在上面的注释中规定,只有过一个在@GearTemp每个条目这只会工作ItemNumber

+0

您的回答指出我的方向正确,但语法应该是这样的:UPDATE P SET PX = GT.X,PY = GT.Y FROM Products P \t INNER JOIN @GearTemp AS GT ON PX = GT.X – broke

+0

对不起,在我发布之前没有在SSMS中进行语法检查。我会相应地编辑它。尽管它很高兴帮助你! – mwigdahl

1

既然你是SQL Server 2008上,则可以使用MERGE语句:

-- Target Table 

DECLARE @tgt TABLE (OrdID INT, ItemID INT, Qty INT, Price MONEY); 
INSERT INTO @tgt (OrdID, ItemID, Qty, Price) 
    SELECT 1, 100, 10, 10.00 UNION ALL 
    SELECT 1, 101, 10, 12.00 


OrdID  ItemID  Qty   Price 
----------- ----------- ----------- --------------------- 
1   100   10   10.00 
1   101   10   12.00 

-- Source Table 
DECLARE @src TABLE (OrdID INT, ItemID INT, Qty INT, Price MONEY); 
INSERT INTO @src (OrdID, ItemID, Qty, Price) 
    SELECT 1, 100, 12, 10.00 UNION ALL 
    SELECT 1, 102, 10, 12.00 UNION ALL 
    SELECT 1, 103, 5, 7.00 


OrdID  ItemID  Qty   Price 
----------- ----------- ----------- --------------------- 
1   100   12   13.00 
1   102   10   12.00 
1   103   5   7.00 

MERGE @tgt AS t 
USING @src AS s 
ON t.OrdID = s.OrdID AND t.ItemID = s.ItemID 
WHEN MATCHED THEN 
    UPDATE SET 
    t.Qty = s.Qty, 
    t.Price = s.Price; 



Content of the target table after the MERGE operation: 
OrdID  ItemID  Qty   Price 
----------- ----------- ----------- --------------------- 
1   100   12   13.00 
相关问题