Informazioni su regole di confronto e Service Broker

Service Broker è progettato per semplificare e rendere più efficiente la comunicazione tra servizi e applicazioni nelle istanze con configurazioni di regole di confronto diverse. Il database che ospita un servizio che invia un messaggio può utilizzare regole di confronto diverse rispetto al database che ospita il servizio che riceve il messaggio. Pertanto, Service Broker utilizza regole di confronto consistenti per i nomi, indipendentemente dalle regole di confronto del database che ospita il servizio. Per rimuovere le informazioni relative alle regole di confronto dal processo di comunicazione, Service Broker utilizza un confronto byte per byte per trovare la corrispondenza tra nomi di servizi, nomi di contratti e nomi di tipi di messaggi. Tramite la corrispondenza dei nomi come sequenze di byte, Service Broker semplifica lo scambio corretto di messaggi tra servizi, senza l'overhead causato dallo scambio di informazioni sulle regole di confronto.

La corrispondenza byte per byte costituisce in effetti un confronto a livello binario che non tiene in considerazione le regole di confronto correnti. Per tale motivo, per molti servizi di Service Broker può essere utile applicare le indicazioni fornite in Denominazione di oggetti di Service Broker. Un'applicazione che segue queste linee guida e gestisce tutti i nomi facendo distinzione tra maiuscole e minuscole dovrebbe funzionare correttamente indipendentemente dalle differenze di regole di confronto tra il database che ospita il servizio di destinazione e il database che ospita il servizio di origine.

Considerazioni sulle regole di confronto delle code

Le code utilizzano regole di confronto consistenti indipendentemente dalle regole di confronto predefinite dell'istanza di SQL Server o del database che ospita la coda. Se la coda è la destinazione di un'istruzione SELECT che include un'istruzione JOIN con un'altra tabella del database, ad esempio una tabella utilizzata per mantenere informazioni sullo stato, può essere necessario specificare esplicitamente le regole per il confronto.

Ad esempio, un'applicazione che utilizza la memorizzazione dei messaggi, può avere l'esigenza di mantenere alcuni messaggi relativi a una conversazione prima che questa venga terminata. Nell'esempio di codice Transact-SQL seguente vengono salvati tutti i messaggi per una conversazione specifica il cui nome di tipo di messaggio è contenuto nella tabella AuditedMessageTypes.

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

L'istruzione SELECT specifica esplicitamente un confronto a livello binario per la corrispondenza dei nomi dei tipi di messaggi. Una coda non utilizza le regole di confronto predefinite del database. Per la corretta esecuzione del confronto am.message_type_name = q.message_type_name è quindi necessaria la clausola COLLATE. Per la corretta corrispondenza del funzionamento del confronto interno utilizzato da Service Broker per abbinare i nomi dei servizi, l'istruzione specifica regole di confronto binarie, Latin1_General_BIN.

Considerazioni sulle regole di confronto delle applicazioni

Service Broker trasmette il corpo del messaggio sotto forma di dati binari e non modifica il contenuto del messaggio. Se le applicazioni scambiano dati sensibili alle regole di confronto, le eventuali differenze nelle regole di confronto devono essere gestite dalle applicazioni stesse. Le applicazioni che scambiano testo utilizzano, in genere, tipi Unicode per ridurre al minimo i problemi relativi alle regole di confronto.