有效的UPDATE,INSERT语法?

时间:2009-09-16 17:48:54

标签: sql sql-server sql-server-2005 tsql

这些陈述是否有效?

UPDATE Table1 
  FROM (SELECT * FROM Table2)  

INSERT INTO Table1 
  (SELECT * FROM Table2)  

2 个答案:

答案 0 :(得分:5)

您的更新语句需要为要更新的每个字段设置一个Set,所以没有。 正确的语法:

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

如果Table1和Table2具有相同顺序的相同列,则您的insert语句将起作用。

编辑:如果您正在寻找更新/插入(Upsert)的示例,请查看此blog post(适用于SQL 2008 - 不确定2005年但有疑问它)。

另一个选项是Update,然后是插入。此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)
   )

答案 1 :(得分:2)

INSERT INTO Table1 
  (SELECT * FROM Table2)

如果你很幸运,那可能有用。

我建议使用更严格的语法:

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

始终显式为我的INSERT和SELECT语句指定架构(dbo)和字段。那样,你可以

  • 删除例如计算,IDENTITY和其他潜在的“问题”案件
  • 当您向表
  • 添加另一列时,您的SQL语句不会中断

马克