SSMS和注册服务器结果


8

背景

我们正在尝试为我们的一个支持团队创建AG“主要”测试工具。不知道在任何给定时间哪些服务器将是指示它们针对已注册服务器组执行TSQL的主要服务器。注册的服务器组由AG中的所有服务器组成。目标是仅在当前主服务器上执行TSQL:

当前测试线束

IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS 
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id 
    WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END

问题

如果第一台响应多服务器查询的服务器未返回任何结果,则SSMS将假定正确的结果集为没有结果集,即使其他服务器随后返回了结果集也是如此。因此,在这种情况下,不会返回任何结果……这是不正确的,也不是预期的功能。

谁能想到使用SSMS(这是CS团队最熟悉的工具)强制在当前主服务器上执行的方法吗?


您是否考虑过将它们连接到AG侦听器,从而以这种方式运行查询?这将确保始终击中主要对象。
Nic

不幸的是,这是不可能的。我们有大量的租户,其监听者的名字相同。在这种情况下就是行不通的。
哈里

Answers:


10

我以前曾遇到过这个**,如果我没记错的话,要确保始终通过多服务器查询获得结果,则当没有行返回时,需要强制使用空结果集。意思是,您需要在其ELSE上创建一个分支,IF并且在其中ELSE进行以下操作:

SELECT CONVERT(DATETIME, NULL) AS [Col1name],
       CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
       ...{additional fields}...
WHERE  1 = 0;

这将产生具有正确名称和数据类型的空结果集。

或,并且我过去没有尝试过此操作(我在键入时就已经想到了),但是您可以通过在该ELSE分支中暂停而使主/预期服务器始终返回其分支而摆脱困境首先设置结果集(这是这里的真正问题:第一个响应的服务器定义了所有其他响应必须遵守的结构)。因此,以下可能是唯一的工作ELSE

WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)

但是我不记得是否有其他服务器完全没有返回任何结果导致错误消息显示在“消息”选项卡中。如果确实发生了,那么空结果集绝对是正确的方法。但是,如果这样做确实可行,那么在通用模板(如您的情况)中,它可能会更好地工作,因为它不需要每次使用时都调整强制的空结果集。

更新:

OP确认:

  • WAITFOR DELAY确实工作,
  • 副本确实报告了错误消息,但对OP的使用没有问题

**我遇到的情况与此类似,但与可用性组或只希望从一台服务器获得结果无关。我们的情况是,我们有18台具有相同架构的服务器,它们具有不同的数据,并且需要执行各种维护任务,以及跨所有18个节点的聚合。有些存储过程由于某种原因偶尔不返回任何结果集,并且无论什么原因,都无法在该存储过程中修复它。因此,根据最先返回的节点,大多数情况下一切都很好,但是有时偶尔返回不结果集的节点会先返回。所以,我不得不这样做结果转储到一个临时表,如果@@ROWCOUNTINSERT...EXEC是0,那么我会选择强制,结果为空。


2
永远不会想到这一点!!等待延迟就像冠军!绝对省去了构建空结果集的麻烦。你是男人@srutzky谢谢
哈里

@Harry谢谢您,谢谢:-)。我刚刚更新了我的答案,以更清楚地了解该WAITFOR DELAY方法的好处,并且您确认它确实有效,因此,谢谢您!
所罗门·鲁兹基

1
这是我本周见过的最酷的东西。
布伦特·奥扎尔

它肯定会在副本上引发错误,但是在这种情况下,这是完全可以的。
哈里

@Harry再次感谢您提供反馈。我将其添加到我的答案中,并在遇到的情况的底部给出了解释。
所罗门·鲁兹基

0

我一直使用临时表返回结果,以从组中的所有服务器获得一致的响应。关于SSMS,多服务器查询是我最喜欢的事情之一。

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.