照合順序と Service Broker について

Service Broker は、照合順序の構成が異なる、インスタンス内のサービスとアプリケーションを簡単に効率よく通信できるようにします。メッセージ送信のサービスをホストするデータベースは、メッセージ受信のサービスをホストするデータベースと同じ照合順序を使用していないことがあります。したがって、Service Broker では、サービスをホストするデータベースの照合順序とは関係なく、一貫性のある名前の照合順序を使用します。通信の処理から照合順序の情報を取り除くため、Service Broker ではバイト単位の比較でサービス名、コントラクト名、およびメッセージ型の名前を照合しています。名前をバイトのシーケンスとして照合することにより、Service Broker は、照合順序の情報を交換する余計なオーバーヘッドをかけずに、単純な方法でサービスの正確なメッセージ交換を実現します。

バイト単位の照合は、現在の照合順序を考慮しない効率のよいバイナリ比較です。このため、多くのブローカ サービスでは、「Service Broker オブジェクトの名前付け」に示す推奨設定に従う場合に便利です。このガイドラインに従って、すべての名前を大文字小文字を区別して取り扱うアプリケーションは、対象サービスをホストするデータベースと、サービスの開始をホストするデータベースの間の照合順序の違いに関係なく、正しく機能します。

キューの照合順序に関する注意点

SQL Server インスタンスの既定の照合順序や、キューをホストするデータベースの既定の照合順序と関係なく、キューでは一貫性のある照合順序を使用します。キューが、データベース内にある別のテーブルを指定した JOIN ステートメントを含む SELECT ステートメントの対象である場合 (状態を保持するために使用するテーブルなど)、比較の照合順序の明示的な指定が必要となることがあります。

たとえば、メッセージの保有期間を使用するアプリケーションでは、アプリケーションがメッセージ交換を終了する前に、そのメッセージの一部を保存する必要があります。次の Transact-SQL コード例では、テーブル 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

SELECT ステートメントでは、メッセージ型名と照合するバイナリ比較を明示的に指定します。キューではデータベースの既定の照合順序を使用しないため、比較 am.message_type_name = q.message_type_name を正常に実行するには COLLATE 句が必要です。このステートメントでは、Service Broker がサービス名の照合に使用する内部比較の動作と一致させるために、バイナリ照合順序 Latin1_General_BIN を指定します。

アプリケーションの照合順序に関する注意点

Service Broker はメッセージ本文をバイナリ データとして転送し、メッセージの内容は変更しません。照合順序を考慮するデータをアプリケーションで交換する場合、アプリケーション側で照合順序の違いに対応する必要があります。テキストを交換するアプリケーションでは、通常、照合順序の問題を最小限にするために Unicode 型を使用します。