Ich bin bereits auf dieses ** gestoßen, und wenn ich mich richtig erinnere, müssen Sie eine leere Ergebnismenge erzwingen, wenn sonst keine Zeilen zurückgegeben würden, um sicherzustellen, dass bei Abfragen mit mehreren Servern immer Ergebnisse erzielt werden. Das heißt, Sie brauchen einen ELSE
Zweig dazu IF
und innerhalb des ELSE
würden Sie so etwas wie das Folgende tun:
SELECT CONVERT(DATETIME, NULL) AS [Col1name],
CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
...{additional fields}...
WHERE 1 = 0;
Dies erzeugt eine leere Ergebnismenge mit den richtigen Namen und Datentypen.
ODER, und ich habe dies in der Vergangenheit nicht versucht (ich habe nur daran gedacht, als ich dies tippte), aber Sie können möglicherweise davonkommen, indem Sie einfach in diesem ELSE
Zweig pausieren, sodass der primäre / beabsichtigte Server immer seinen zurückgeben kann Ergebnismenge zuerst (was hier das eigentliche Problem ist: Der erste Server, der antwortet, definiert die Struktur, an die sich alle anderen Antworten halten müssen). Daher könnte das Folgende als das einzige in der Arbeit funktionieren ELSE
:
WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)
Ich kann mich jedoch nicht erinnern, ob bei der Rückgabe anderer Ergebnisse durch andere Server eine Fehlermeldung auf der Registerkarte "Nachrichten" angezeigt wurde. In diesem Fall ist die leere Ergebnismenge definitiv der richtige Weg. Wenn dies jedoch funktioniert, funktioniert dies möglicherweise besser in einer allgemeinen Vorlage (wie es in Ihrem Fall der Fall zu sein scheint), da die erzwungene, leere Ergebnismenge nicht jedes Mal angepasst werden muss, wenn sie verwendet wird.
AKTUALISIEREN:
Das OP bestätigte Folgendes:
- das
WAITFOR DELAY
hat ja funktioniert, und
- Die Replikate meldeten zwar die Fehlermeldung, stellten jedoch kein Problem für die Verwendung des OP dar
** Die Situation, in die ich geriet, war ähnlich, hatte jedoch nichts mit Verfügbarkeitsgruppen zu tun oder mit dem Wunsch, Ergebnisse von nur einem Server zu erhalten. Unsere Situation war, dass wir 18 Server mit demselben Schema und unterschiedlichen Daten hatten und verschiedene Wartungsaufgaben ausführen mussten, Aggregationen über alle 18 Knoten. Es gab einige gespeicherte Prozeduren, die aus irgendeinem Grund gelegentlich keine Ergebnismenge zurückgaben, und aus welchem Grund auch immer, sie konnten nicht innerhalb der gespeicherten Prozedur behoben werden. Abhängig davon, welcher Knoten zuerst zurückgegeben wurde, war die meiste Zeit alles in Ordnung, aber hin und wieder gab der Knoten, der manchmal keine Ergebnismenge zurückgab, zuerst zurück. Also musste ich so etwas wie die Ergebnisse in eine temporäre Tabelle kopieren und wenn @@ROWCOUNT
das INSERT...EXEC
0 war, würde ich die erzwungene, leere Ergebnismenge auswählen.