调用 OPENROWSET 时 INSERT INTO 和 SELECT INTO 的区别

Posted

技术标签:

【中文标题】调用 OPENROWSET 时 INSERT INTO 和 SELECT INTO 的区别【英文标题】:Difference between INSERT INTO and SELECT INTO when calling OPENROWSET 【发布时间】:2016-12-21 16:57:41 【问题描述】:
select 1 as X,d.* into [TravelData] from OPENROWSET('SQLNCLI','Server=<redacted>',
     'exec [OtherDB].[GetTravelData]  1, ''28-Nov-2016 16:00'', ''28-Nov-2016 19:00''') as d

我有这种方法可以将远程数据库啜饮到本地表中。此语法似乎有效,但出现错误:

数据库中已经有一个名为“TravelData”的对象。

有道理,SELECT INTO 应该来创建表。但是我想我只是将SELECT 更改为INSERT 然后我得到语法错误。将这些数据放入结构与查询输出匹配的现有数据库表中的正确语法应该是什么?

【问题讨论】:

我认为您的意思是“SELECT INTO 应该创建 ”,而不是 DB。您可以在此处阅读SELECT INTOINSERT INTO 的比较:INSERT INTO vs SELECT INTO。 Prdp下面的答案似乎完美地处理了你的具体情况。 【参考方案1】:

它与使用 OPENROWSET 无关。

INSERT INTO ... 要求表已经存在。

SELECT ... INTO 要求表 存在。该表将由语句使用 SELECT 中定义的列创建。

【讨论】:

【参考方案2】:

这里是INSERT INTO SELECT 语法

INSERT INTO [TravelData]
            (X,
             col1,
             col2,
             ...)
SELECT 1 AS X,
       d.col1,
       d.col2,
       .....
FROM   OPENROWSET('SQLNCLI',
                  'Server=<redacted>',
                  'exec [OtherDB].[GetTravelData]  1, ''28-Nov-2016 16:00'', ''28-Nov-2016 19:00''') AS d 

注意:select 列表中添加column 列表,而不是*。同样在Insert 中提及列列表

【讨论】:

以上是关于调用 OPENROWSET 时 INSERT INTO 和 SELECT INTO 的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQLSERVER调用OPENROWSET的方法

数据仓库之抽取数据:通过openrowset执行存储过程

行集函数:OpenRowSet 和 OpenQuery

数据仓库之抽取数据:openrowset函数带bulk操作符的用法

mysql 存储过程执行insert无法插入数据求助

SQL 中的 OpenRowSet 命令返回 NULLS