SELECT和INSERT的OPENQUERY有何不同?

Abs*_*Abs 13 mysql t-sql sql-server odbc linked-server

我知道以下查询将从链接服务器下拉结果集:

SELECT * FROM openquery(DEVMYSQL, 
    'SELECT event_id, people_id, role_id, rank, last_updated FROM event_cast')
Run Code Online (Sandbox Code Playgroud)

但是,在插入时这是同样的情况吗?它会下拉结果集还是仅获取列信息?

INSERT INTO openquery(DEVMYSQL, 
     'SELECT event_id, people_id, role_id, rank, last_updated FROM event_cast')
Run Code Online (Sandbox Code Playgroud)

如果是前者,那么这是非常低效的.我应该限制返回的结果集,这会影响我INSERT吗?

这基本上是如何的一个问题OPENQUERY,当谈到工作SELECTINSERT.

我感谢任何帮助.

Zel*_*oss 10

不确定您尝试使用INSERT完成的任务.

正确的语法(如果要在REMOTE服务器上插入)应该是

INSERT into openquery(MyServer, 'dbo.event_cast') values ('','')
Run Code Online (Sandbox Code Playgroud)

select只会延迟您的插入检索选择查询返回的内容(无效)而不提供其他信息.此外,使用openquery,您可以使用此语法,更正确的插入:

INSERT into myserver.mydatabase.dbo.event_Cast values('','')
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试插入LOCAL服务器,则选择语法检索的值应为:

INSERT into dbo.my_localtable SELECT * FROM openquery(DEVMYSQL, 'SELECT event_id, people_id, role_id, rank, last_updated FROM event_cast')
Run Code Online (Sandbox Code Playgroud)

是的,句子将插入值,而不仅是列信息.

如果你只想在本地复制表一个简单的

SELECT top 1 * into new_local_event_cast FROM openquery(DEVMYSQL, 'SELECT event_id, people_id, role_id, rank, last_updated FROM event_cast');
TRUNCATE TABLE new_local_event_cast;
Run Code Online (Sandbox Code Playgroud)

就足够了

  • 仅供参考:第二个示例中的四部分命名语法仅在链接服务器类型已注册到分布式事务中时才有效.(大多数是,只是一个问题.) (2认同)

Pse*_*oad 5

如果 SELECT 将返回记录,则 INSERT 将不会返回除受影响的记录数之外的结果集。这可以通过使用 SET NOCOUNT ON 来抑制;但是,我不确定抑制是否指可见性或实际出现的行数。

    INSERT INTO OPENQUERY(MYSERVER, 'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [Blah].[dbo].[SQL_Drives]')
    SELECT 'X', 2, 'MyServer'

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

对于从 INSERT 返回的记录,实现这一点的唯一方法是使用 OUTPUT 子句。客户端计算机将无权访问 OUTPUT INSERTED 行,因此无法返回这些行。如果您尝试运行以下命令,您将收到错误:

INSERT INTO OPENQUERY(MYSERVER, 'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [BLAH].[dbo].[SQL_Drives]')
OUTPUT INSERTED.*
SELECT 'X', 2, 'MyServer'

Msg 405, Level 16, State 1, Line 1
A remote table cannot be used as a DML target in a statement which includes an OUTPUT clause or a nested DML statement.


 -- EDIT RESULTS OF PROFILER ---------------------------      


-- Statements that occured on server called through OPENQUERY
    exec sp_cursoropen @p1 output,N'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [MyServer].[dbo].[SQL_Drives]',@p3 output,@p4 output,@p5 output
    select @p1, @p3, @p4, @p5

    exec sp_cursor 180150009,4,0,N'[MyServer].[dbo].[SQL_Drives]',@Drive_Letter='X',@MBFree=2,@Server='MyServer'


--Statements that occured on client
    INSERT INTO OPENQUERY(MyServer, 'SELECT [Drive_Letter] ,[MBFree],[Server] FROM [MyServer].[dbo].[SQL_Drives]')
    SELECT 'X', 2, 'MyServer'
Run Code Online (Sandbox Code Playgroud)