2009-09-16 190 views

回答

5

您的更新聲明需要爲每個要更新的字段設置,所以不需要。 正確的語法:

UPDATE table1 
SET table1.field1=table2.field1, table1.field2=table2.field2 
FROM table1 
INNER JOIN table2 ON table1.keyfield = table2.keyfield 

你插入語句將工作提供了Table 1和Table都以相同的順序相同的列。

編輯:如果您正在尋找更新/插入(的Upsert)的例子,看看這個blog post(其中2008年SQL工作 - 不知道2005年,但懷疑這一點)。

另一種選擇是更新,然後是插入。從這個blog post例如:

UPDATE CustomersA 
    SET CustomerName = B.CustomerName 
FROM CustomersA A (NoLock) 
INNER JOIN CustomersB B (NoLock) ON A.CustomerId = B.CustomerId 

And later run the Insert command 
INSERT INTO CustomersA (
    CustomerId, 
    CustomerName 
) 

SELECT 
    Id, 
    Name 
FROM CustomersB (NoLock) 
WHERE 
    Id NOT IN (
     SELECT CustomerId FROM CustomersA (NoLock) 
    ) 
+3

一個小小的警告,如果有插入會失敗存在任何身份字段。 – MartW 2009-09-16 17:53:08

+2

您應該始終指定要使用的列。當選擇添加,刪除或重新排序列時,「Select *」可能會停止工作。 – 2009-09-16 17:54:18

+2

在SQL Server 2008中總是有MERGE來執行你的UPSERT(UPDATE/INSERT) – 2009-09-16 17:56:30

2
INSERT INTO Table1 
    (SELECT * FROM Table2) 

可以工作 - 如果你是幸運的。

我建議採用更嚴格的語法:

INSERT INTO dbo.Table1 (Field1, Field2, ..., FieldN) 
    SELECT Field1, Field2, ..., FieldN 
    FROM dbo.Table2 

我會總是明確指定模式(DBO)和字段我的兩個INSERT和我的SELECT語句。這樣,你可以

  • 消除例如,計算,身份和其他潛在的「問題」的情況下
  • 當你添加另一列到兩個表中的SQL語句不會打破

馬克