Являются ли эти утверждения действительными?Действительный UPDATE, INSERT синтаксис?
UPDATE Table1
FROM (SELECT * FROM Table2)
INSERT INTO Table1
(SELECT * FROM Table2)
Являются ли эти утверждения действительными?Действительный UPDATE, INSERT синтаксис?
UPDATE Table1
FROM (SELECT * FROM Table2)
INSERT INTO Table1
(SELECT * FROM Table2)
Ваш оператор обновления нуждается в наборе для каждого поля, которое вы хотите обновить, поэтому нет. Правильный синтаксис:
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)
)
INSERT INTO Table1
(SELECT * FROM Table2)
Это может работать - если вам повезет.
Я бы рекомендовал использовать более строгий синтаксис:
INSERT INTO dbo.Table1 (Field1, Field2, ..., FieldN)
SELECT Field1, Field2, ..., FieldN
FROM dbo.Table2
Я всегда и явно указать схему (ДБО) и поля для обоих моих INSERT и SELECT, мои заявления. Таким образом, вы можете
Марк
Небольшой нюанс в том, что вставки потерпит неудачу, если есть любые поля идентичности. – MartW
Вы всегда должны указывать столбцы, с которыми хотите работать. «Выбрать *», вероятно, перестанет работать, когда столбцы будут добавлены, сброшены или переупорядочены. –
Всегда есть MERGE в SQL Server 2008 для выполнения вашего UPSERT (UPDATE/INSERT) –