6

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

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

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

4

3 回答 3

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

参考:

于 2010-03-03T20:46:16.830 回答
2

除了@OMG Ponies 所说的之外,这根本没有必要。当您不需要时,没有理由引入临时查询和分布式事务语义。使用时,OPENQUERY您会承担动态 SQL 的所有负面影响,包括不可预测的计划和服务器无法准确跟踪依赖关系。

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

于 2010-03-03T20:49:38.883 回答
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;

查看任何差异。

于 2013-06-11T14:54:10.700 回答