选择语法作为要插入的子查询

时间:2014-02-12 02:12:20

标签: sql syntax-error

以下是我在SQL查询分析器中尝试做的事情。

Insert into db_name1.dbo.tb_name1 (select * from db_name2.dbo.tb_name2)

但我不断收到此错误消息

Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'select'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ')'.

我想知道出了什么问题。子查询在SQL Server 2000中不起作用吗? 这个的正确语法是什么?我想将数据库的表列中的所有值传递到另一个数据库的另一个表,而不创建其元素的任何副本,但只是覆盖当前值。

1 个答案:

答案 0 :(得分:2)

这是您认为应该重叠的查询:

Insert into db_name1.dbo.tb_name1
    (select * from db_name2.dbo.tb_name2)

这是编译器看到的查询:

Insert into db_name1.dbo.tb_name1(select * from db_name2.dbo.tb_name2)

也就是说,表名后的开括号表示“列的列表从这里开始”。但是你没有列的列表。 select不是有效的列名。因此错误。

通过删除括号可以很容易地解决这个问题:

Insert into db_name1.dbo.tb_name1
    select * from db_name2.dbo.tb_name2

但是,包含要插入的列名更为正确:

Insert into db_name1.dbo.tb_name1(col1 . . .)
    select * from db_name2.dbo.tb_name2;

总是在insert语句中包含列名是个好主意。如果你这样做了,你就不必问这个问题了。