SQL Server 中,EXEC ... AT 和 OPENQUERY 都是用于执行链接服务器(Linked Server)上的远程查询的机制,他们之间的区别
一、EXEC ('...') AT linked_server_name
EXEC ('DELETE FROM your_oracle_temp_table') AT DS;
EXEC (...) AT ds 表示在名为 ds的链接服务器(Linked Server)上执行一段 SQL 脚本。
这个语句会在远程服务器上直接执行你传入的字符串 SQL。
适用场景:
执行远程数据库的删除、更新等操作;
当不需要从远程获取数据集时;
当你要执行的 SQL 是动态生成的;
二、OPENQUERY(linked_server, 'query')
SELECT * FROM OPENQUERY(ds, 'SELECT * FROM your_oracle_temp_table');
OPENQUERY 是一种行集函数,它会把远程服务器上的查询结果作为一个表返回给本地 SQL Server。
可以在本地进行进一步的 JOIN、WHERE 等处理。
从远程数据库中读取数据;
需要将远程结果集作为本地表使用;
常用于跨数据库联合查询(如 Oracle + SQL Server 联合查询)。
三、总结对比
| 对比项 | EXEC (...) AT linked_server | OPENQUERY(linked_server, 'query') |
|---|---|---|
| 是否返回结果集 | 否(除非远程有 SELECT) | 是(必须为 SELECT) |
| 是否执行远程 SQL | 是 | 是 |
| 用途 | DML/DDL 操作 | 查询数据 |
| 能否参与本地查询 | 否(除非有 OUTPUT 或结果集) | 是,可以 JOIN、WHERE 等 |
| 参数化支持 | 否,需拼接字符串 | 否,需拼接字符串 |
| 安全性 | 存在 SQL 注入风险 | 存在 SQL 注入风险 |
| 推荐用法 | 删除、更新远程数据 | 查询远程数据并参与本地处理 |
本文来自博客园,作者: 三生有幸格格,转载请注明原文链接:https://www.cnblogs.com/mylive/p/18926468
浙公网安备 33010602011771号