Grundlegendes zu Sortierung und Service Broker

Service Broker ermöglicht eine einfache und effiziente Kommunikation von Diensten und Anwendungen in Instanzen mit verschiedenen Sortierungskonfigurationen. Die Datenbank, die als Host für einen Dienst dient, der eine Nachricht sendet, verwendet möglicherweise nicht dieselbe Sortierung wie die Datenbank, die als Host für den Dienst dient, der die Nachricht empfängt. Deshalb verwendet Service Broker eine konsistente Sortierung für Namen, ohne Berücksichtigung der Sortierung der Datenbank, die als Host für den Dienst dient. Zum Entfernen von Sortierungsinformationen aus dem Kommunikationsprozess verwendet Service Broker einen byteweisen Vergleich, um Dienstnamen, Vertragsnamen und Nachrichtentypnamen abzugleichen. Durch das Abgleichen von Namen in Form von Bytefolgen ermöglicht es Service Broker Anwendungen, Nachrichten ohne den durch den Austausch von Sortierungsinformationen bedingten zusätzlichen Verwaltungsaufwand ordnungsgemäß auszutauschen.

Bei dem byteweisen Abgleich handelt es sich um einen binären Vergleich, bei dem die aktuelle Sortierung nicht berücksichtigt wird. Aus diesem Grund folgen viele Brokerdienste den Empfehlungen unter Benennen von Service Broker-Objekten. Eine Anwendung, die diesen Richtlinien folgt und alle Namen nach Groß- und Kleinschreibung unterscheidet, sollte immer ordnungsgemäß ausgeführt werden, unabhängig von Sortierungsunterschieden zwischen der Datenbank, die als Host für den Zieldienst dient, und der Datenbank, die als Host für den initiierenden Dienst dient.

Überlegungen zur Warteschlangensortierung

Warteschlangen verwenden eine konsistente Sortierung, unabhängig von der Standardsortierung der SQL Server-Instanz oder der Standardsortierung der Datenbank, die als Host für die Warteschlange dient. Wenn eine Warteschlange das Ziel einer SELECT-Anweisung ist, die eine JOIN-Anweisung mit einer anderen Tabelle in der Datenbank einschließt, z. B. eine Tabelle, die zur Verwaltung von Statusinformationen verwendet wird, müssen Sie möglicherweise die Sortierung für den Vergleich explizit angeben.

Eine Anwendung, die eine Funktion zur Beibehaltung von Nachrichten verwendet, muss möglicherweise einige Nachrichten für eine Konversation beibehalten, bevor die Anwendung die Konversation beendet. In dem folgenden Transact-SQL-Codebeispiel werden alle Nachrichten für eine gegebene Konversation gespeichert, die einen Nachrichtentypnamen in der Tabelle AuditedMessageTypes aufweisen.

IF @messageTypeName =
  'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
BEGIN
  INSERT INTO dbo.AuditRecord
    SELECT q.message_type_name, q.message_body
      FROM dbo.ApplicationQueue AS q
        JOIN dbo.AuditedMessageTypes AS am ON
             am.message_type_name = q.message_type_name
             COLLATE Latin1_General_BIN
           AND
             q.conversation_handle = @conversationHandle
   END CONVERSATION @conversationHandle
END

Die SELECT-Anweisung gibt explizit einen binären Vergleich für den Abgleich der Nachrichtentypnamen an. Weil eine Warteschlange die Standardsortierung der Datenbank nicht verwendet, ist die COLLATE-Klausel erforderlich, damit der Vergleich am.message_type_name = q.message_type_name erfolgreich ist. Die Anweisung gibt die binäre Sortierung Latin1_General_BIN an, die dem Verhalten des internen Vergleichs entspricht, den Service Broker für den Abgleich von Dienstnamen verwendet.

Überlegungen zur Anwendungssortierung

Service Broker sendet den Nachrichtentext in Form binärer Daten und ändert den Inhalt der Nachricht nicht. Wenn Anwendungen Daten austauschen, die sortierungsabhängig sind, müssen die Anwendungen Sortierungsunterschiede verarbeiten. Anwendungen, die Text austauschen, verwenden im Allgemeinen Unicode-Typen, um Sortierungsprobleme zu minimieren.