2009-09-16 4 views

ответ

5

Ваш оператор обновления нуждается в наборе для каждого поля, которое вы хотите обновить, поэтому нет. Правильный синтаксис:

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

Добавленное заявление будет работать при условии, что Table1 и Table2 имеют одинаковые столбцы в том же порядке.

Edit: Если вы ищете пример Update/Insert (Upsert), проверить это blog post (который работает на SQL 2008 - не уверен, что 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

+2

Вы всегда должны указывать столбцы, с которыми хотите работать. «Выбрать *», вероятно, перестанет работать, когда столбцы будут добавлены, сброшены или переупорядочены. –

+2

Всегда есть MERGE в SQL Server 2008 для выполнения вашего UPSERT (UPDATE/INSERT) –

2
INSERT INTO Table1 
    (SELECT * FROM Table2) 

Это может работать - если вам повезет.

Я бы рекомендовал использовать более строгий синтаксис:

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

Я всегда и явно указать схему (ДБО) и поля для обоих моих INSERT и SELECT, мои заявления. Таким образом, вы можете

  • исключить столбцы, например. вычислен, IDENTITY и другие потенциальные «проблемные» случаи
  • ваш SQL заявление не будет ломаться, когда вы добавить еще один столбец в любой таблице

Марк