什么是“异构查询”?


14

我收到有关我在程序中运行的SQL查询的以下错误消息。SQL Server 2005 T-SQL。

异构查询要求为连接设置ANSI_NULLSANSI_WARNINGS选项。这样可以确保一致的查询语义。启用这些选项,然后重新发出查询。(严重性16)

修复起来很容易,设置ANSI_NULLSANSI_WARNINGS ON,但是我想知道什么是异构查询。Google搜索带来了数十个结果,告诉我要设置ANSI_NULLSANSI_WARNINGS,而没有解释该术语的含义。查询是:

UPDATE SRV.DB.DBO.TABLE SET Column=
            (SELECT Column 
            FROM SRV1.DB.DBO.TABLE)

我在想这是由于在一个查询中连接到多个数据库引擎,否则我就再也没有收到这个错误。
在这种情况下,“异构”是否仅指查询两个不同的数据库引擎?

Answers:


8

在这种情况下,“异构”是否仅指查询两个不同的数据库引擎?

基本上是。在“异构链接服务器”上执行“异构”查询。对该链接服务器的所有查询将是异构的。

而“异构”是分布式查询的子集

  • 分布式数据存储在SQL Server的多个实例中。
  • 通过使用OLE DB提供程序访问的各种关系和非关系数据源中存储的异构数据。

但是,“异构”有时会弹出:

请参阅在MSDN上链接服务器

能够在整个企业的异构数据源上发布分布式查询,更新,命令和事务。

sp_addlinkedserver

链接服务器允许访问针对OLE DB数据源的分布式异构查询。

“加入异构数据”中查询Active Directory的MSDN示例

和MSDN再次“异构数据库复制”


6

据我所知,是的。

我在查询中看到的一个问题是,您无法知道链接表将返回哪一行。这只是伪代码还是您的查询是以这种方式编写的?


这是伪代码,我从40个数据库中提取了一个列,并将这些值保存到“状态报告”表中。
Ben Brocka

1
哦好的。只是想确保您知道Srv.db.dbo.table上该列中的值可能会有所不同,具体取决于您运行代码的SQL Server版本。特别是从SQL 2005到SQL 2008,使用发布的代码,您将获得不同的价值。
mrdenny

现在您已经让我感兴趣了,潜在的问题是什么,只是我不知道要获得哪一行?在这种情况下,表只有一行,这就是为什么子查询中没有WHERE的原因。
本·布罗卡

如果表中有多行,则使用SQL 2005可获得第一行。使用SQL 2008,新表将获得第二行。(我可能会倒退。)
mrdenny

我本来喜欢MS的一篇文章,确切地解释了什么是“异构查询”,但似乎不存在这样的事情,因此我将其标记为正确。
本·布罗卡

1

异构只是意味着不同。因此,异构查询位于一个数据库中,并且正在查询一个不同的数据库。由于数据库不同,因此带来了设置不同的可能性,这可能导致结果与预期不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.