为什么在本地服务器上使用OPENQUERY不好?

时间:2010-03-03 20:37:08

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

我正在编写一个应该在一堆服务器上运行的脚本,并从中选择一堆数据,包括本地服务器。 SELECT我需要的数据所需的SQL非常复杂,所以我正在编写一种特殊的视图,并使用OPENQUERY语句来获取数据,所以最终我最终循环遍历这样的语句:

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')

但是,我听说在本地服务器上使用OPENQUERY是不受欢迎的。有人可以详细说明原因吗?

3 个答案:

答案 0 :(得分:6)

  • 虽然查询可能会返回多个结果集,但OPENQUERY只返回第一个结果集。
  • OPENQUERY不接受其参数的变量。
  • OPENQUERY不能用于在链接服务器上执行扩展存储过程。但是,可以使用由四部分组成的名称在链接服务器上执行扩展存储过程。
  • 如果在同一脚本中使用sp_addlinkedserver存储过程,则远程服务器上使用的凭据将硬编码到脚本中,任何拥有副本的人都可以看到

参考:

答案 1 :(得分:2)

除了@OMG Ponies所说的,它根本就没必要。没有必要时,没有理由引入即席查询和分布式事务语义。当您使用OPENQUERY时,您将承担动态SQL的所有负面影响,包括不太可预测的计划以及服务器无法准确跟踪依赖性。

OPENQUERY还要求本地用户拥有目标服务器的权限,这可能不是您想要的,除非它是管理脚本。您不能指望一个数据库的每个用户对每个其他数据库具有相同的权限。

答案 2 :(得分:2)

只是一个后续行动。

当你必须比较或操纵存储过程中的某些行集时,

OpenQuery 是好的。

例如,如果您必须比较从 SQL Server 2005 迁移到 SQL Server 2008 的两台服务器(测试和推出服务器)的结果,那么您可以执行以下查询:

select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp');
select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp');

select * from test_table
except
select * from rollout_table;

select * from rollout_table
except
select * from test_table;

查看任何差异。