CREATE QUEUE (Transact-SQL)CREATE QUEUE (Transact-SQL)

GILT FÜR: JaSQL Server JaAzure SQL-Datenbank (nur verwaltete Instanz) NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database (Managed Instance only) NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Erstellt eine neue Warteschlange in einer Datenbank.Creates a new queue in a database. Fügt einer Warteschlange gespeicherte Nachrichten hinzu.Queues store messages. Wenn eine Nachricht für einen Dienst eintrifft, platziert Service BrokerService Broker die Nachricht in der dem Dienst zugeordneten Warteschlange.When a message arrives for a service, Service BrokerService Broker puts the message on the queue associated with the service.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

CREATE QUEUE <object>
   [ WITH
     [ STATUS = { ON | OFF } [ , ] ]
     [ RETENTION = { ON | OFF } [ , ] ]
     [ ACTIVATION (
         [ STATUS = { ON | OFF } , ]
           PROCEDURE_NAME = <procedure> ,
           MAX_QUEUE_READERS = max_readers ,
           EXECUTE AS { SELF | 'user_name' | OWNER }
            ) [ , ] ]
     [ POISON_MESSAGE_HANDLING (
         [ STATUS = { ON | OFF } ] ) ]
    ]
     [ ON { filegroup | [ DEFAULT ] } ]
[ ; ]

<object> ::=
{ database_name.schema_name.queue_name | schema_name.queue_name | queue_name }

<procedure> ::=
{ database_name.schema_name.stored_procedure_name | schema_name.stored_procedure_name | stored_procedure_name }

ArgumenteArguments

database_name (Objekt) ist der Name der Datenbank, in der die neue Warteschlange erstellt werden soll.database_name (object) Is the name of the database within which to create the new queue. database_name muss dem Namen einer vorhandenen Datenbank entsprechen.database_name must specify the name of an existing database. Wird database_name nicht bereitgestellt, wird die Warteschlange in der aktuellen Datenbank erstellt.When database_name is not provided, the queue is created in the current database.

schema_name (Objekt) ist der Name des Schemas, zu dem die neue Warteschlange gehört.schema_name (object) Is the name of the schema to which the new queue belongs. Standardmäßig handelt es sich bei dem Schema um das Standardschema für den Benutzer, der die Anweisung ausführt.The schema defaults to the default schema for the user that executes the statement. Wird die CREATE QUEUE-Anweisung von einem Mitglied der festen Serverrolle sysadmin oder einem Mitglied der festen Datenbankrollen db_dbowner oder db_ddladmin in der durch database_name angegebenen Datenbank ausgeführt, kann schema_name ein anderes als das dem Anmeldenamen der aktuellen Verbindung zugeordnete Schema angeben.If the CREATE QUEUE statement is executed by a member of the sysadmin fixed server role, or a member of the db_dbowner or db_ddladmin fixed database roles in the database specified by database_name, schema_name can specify a schema other than the one associated with the login of the current connection. Andernfalls muss es sich bei schema_name um das Standardschema für den Benutzer handeln, der die Anweisung ausführt.Otherwise, schema_name must be the default schema for the user who executes the statement.

queue_name ist der Name der zu erstellenden Warteschlange.queue_name Is the name of the queue to create. Dieser Name muss den Richtlinien für SQL ServerSQL Server-Bezeichner entsprechen.This name must meet the guidelines for SQL ServerSQL Server identifiers.

STATUS (Warteschlange) gibt an, ob die Warteschlange verfügbar ist (ON) oder nicht (OFF).STATUS (Queue) Specifies whether the queue is available (ON) or unavailable (OFF). Ist die Warteschlange nicht verfügbar, können der Warteschlange keine Nachrichten hinzugefügt oder aus ihr entfernt werden.When the queue is unavailable, no messages can be added to the queue or removed from the queue. Sie können die Warteschlange im nicht verfügbaren Status erstellen, damit Nachrichten erst dann in der Warteschlange ankommen, wenn die Warteschlange mit einer ALTER QUEUE-Anweisung zur Verfügung gestellt wird.You can create the queue in an unavailable state to keep messages from arriving on the queue until the queue is made available with an ALTER QUEUE statement. Wird diese Klausel nicht angegeben, ist die Standardeinstellung ON, und die Warteschlange ist verfügbar.If this clause is omitted, the default is ON, and the queue is available.

RETENTION gibt die Aufbewahrungseinstellung für die Warteschlange an.RETENTION Specifies the retention setting for the queue. Ist RETENTION = ON, werden alle Nachrichten, die für Konversationen mit dieser Warteschlange gesendet oder empfangen werden, in der Warteschlange beibehalten, bis die Konversationen beendet sind.If RETENTION = ON, all messages sent or received on conversations that use this queue are retained in the queue until the conversations have ended. Dies ermöglicht es Ihnen, Nachrichten zu Überwachungszwecken oder zur Ausführung von kompensierenden Transaktionen beim Auftreten eines Fehlers beizubehalten.This lets you retain messages for auditing purposes, or to perform compensating transactions if an error occurs. Wird diese Klausel nicht angegeben, wird die Beibehaltungseinstellung standardmäßig auf OFF festgelegt.If this clause is not specified, the retention setting defaults to OFF.

Hinweis

Das Festlegen von RETENTION = ON kann die Leistung reduzieren.Setting RETENTION = ON can decrease performance. Diese Einstellung sollte nur verwendet werden, wenn sie für die Anwendung erforderlich ist.This setting should only be used if it is required for the application.

ACTIVATION gibt Informationen über die gespeicherte Prozedur an, die Sie für die Verarbeitung von Nachrichten in dieser Warteschlange starten müssen.ACTIVATION Specifies information about which stored procedure you have to start to process messages in this queue.

STATUS (Aktivierung) gibt an, ob Service BrokerService Broker die gespeicherte Prozedur startet.STATUS (Activation) Specifies whether Service BrokerService Broker starts the stored procedure. Ist STATUS = ON, startet die Warteschlange die mit PROCEDURE_NAME angegebene gespeicherte Prozedur, wenn die Anzahl der zurzeit ausgeführten Prozeduren kleiner als MAX_QUEUE_READERS ist und wenn Nachrichten schneller in der Warteschlange ankommen, als die gespeicherten Prozeduren Nachrichten empfangen.When STATUS = ON, the queue starts the stored procedure specified with PROCEDURE_NAME when the number of procedures currently running is less than MAX_QUEUE_READERS and when messages arrive on the queue faster than the stored procedures receive messages. Ist STATUS = OFF, startet die Warteschlange die gespeicherte Prozedur nicht.When STATUS = OFF, the queue does not start the stored procedure. Wird diese Klausel nicht angegeben, ist die Standardeinstellung ON.If this clause is not specified, the default is ON.

PROCEDURE_NAME = <Prozedur> gibt den Namen der gespeicherten Prozedur an, die für die Verarbeitung von Nachrichten in dieser Warteschlange gestartet werden soll.PROCEDURE_NAME = <procedure> Specifies the name of the stored procedure to start to process messages in this queue. Dieser Wert muss ein SQL ServerSQL Server-Bezeichner sein.This value must be a SQL ServerSQL Server identifier.

database_name(Prozedur) ist der Name der Datenbank, die die gespeicherte Prozedur enthält.database_name(procedure) Is the name of the database that contains the stored procedure.

schema_name(Prozedur) ist der Name des Schemas, das die gespeicherte Prozedur enthält.schema_name(procedure) Is the name of the schema that contains the stored procedure.

procedure_name ist der Name der gespeicherten Prozedur.procedure_name Is the name of the stored procedure.

MAX_QUEUE_READERS =max_readers gibt die maximale Anzahl von Instanzen der gespeicherten Aktivierungsprozedur an, die von der Warteschlange gleichzeitig gestartet werden.MAX_QUEUE_READERS =max_readers Specifies the maximum number of instances of the activation stored procedure that the queue starts at the same time. Der Wert von max_readers muss eine Zahl zwischen 0 und 32767 sein.The value of max_readers must be a number between 0 and 32767.

EXECUTE AS gibt das SQL ServerSQL Server-Datenbank-Benutzerkonto an, unter dem die gespeicherte Aktivierungsprozedur ausgeführt wird.EXECUTE AS Specifies the SQL ServerSQL Server database user account under which the activation stored procedure runs. SQL ServerSQL Server muss zum Zeitpunkt des Startens der gespeicherten Prozedur durch die Warteschlange die Berechtigungen für diesen Benutzer überprüfen können.must be able to check the permissions for this user at the time that the queue starts the stored procedure. Bei einem Domänenbenutzer muss der Server mit der Domäne verbunden sein, wenn die Prozedur gestartet wird. Andernfalls erzeugt die Aktivierung einen Fehler.For a domain user, the server must be connected to the domain when the procedure is started or activation fails. Bei einem SQL ServerSQL Server-Benutzer kann der Server immer die Berechtigungen überprüfen.For a SQL ServerSQL Server user, the server can always check permissions.

SELF gibt an, dass die gespeicherte Prozedur als der aktuelle Benutzer ausgeführt wird.SELF Specifies that the stored procedure executes as the current user. (Der Datenbankprinzipal, der diese CREATE QUEUE-Anweisung ausführt.)(The database principal executing this CREATE QUEUE statement.)

'user_name' ist der Name des Benutzers, als der die gespeicherte Prozedur ausgeführt wird.'user_name' Is the name of the user who the stored procedure executes as. Der user_name-Parameter muss ein gültiger SQL ServerSQL Server-Benutzer sein, der als SQL ServerSQL Server-Bezeichner angegeben wird.The user_name parameter must be a valid SQL ServerSQL Server user specified as a SQL ServerSQL Server identifier. Der aktuelle Benutzer muss über die IMPERSONATE-Berechtigung für den mit user_name angegebenen Benutzer verfügen.The current user must have IMPERSONATE permission for the user_name specified.

OWNER gibt an, dass die gespeicherte Prozedur als der Besitzer der Warteschlange ausgeführt wird.OWNER Specifies that the stored procedure executes as the owner of the queue.

POISON_MESSAGE_HANDLING gibt an, ob die Behandlung nicht verarbeitbarer Nachrichten für die Warteschlange aktiviert ist.POISON_MESSAGE_HANDLING Specifies whether poison message handling is enabled for the queue. Der Standardwert ist ON.The default is ON.

Eine Warteschlange, für die die Behandlung nicht verarbeitbarer Nachrichten auf OFF festgelegt ist, wird erst nach fünf aufeinander folgenden Transaktionsrollbacks deaktiviert.A queue that has poison message handling set to OFF will not be disabled after five consecutive transaction rollbacks. Daher ist es möglich, dass von der Anwendung ein System für die Behandlung nicht verarbeitbarer Nachrichten definiert wird.This allows for a custom poison message handing system to be defined by the application.

ON Dateigruppe | [DEFAULT] gibt die SQL ServerSQL Server-Dateigruppe an, in der diese Warteschlange erstellt werden soll.ON filegroup | [DEFAULT] Specifies the SQL ServerSQL Server filegroup on which to create this queue. Sie können mit dem filegroup-Parameter eine Dateigruppe identifizieren oder mit dem DEFAULT-Bezeichner die Standarddateigruppe für die Service Broker-Datenbank verwenden.You can use the filegroup parameter to identify a filegroup, or use the DEFAULT identifier to use the default filegroup for the service broker database. Im Kontext dieser Klausel ist DEFAULT kein Schlüsselwort und muss als Bezeichner begrenzt sein.In the context of this clause, DEFAULT is not a keyword, and must be delimited as an identifier. Wird keine Dateigruppe angegeben, verwendet die Warteschlange die Standarddateigruppe für die Datenbank.When no filegroup is specified, the queue uses the default filegroup for the database.

BemerkungenRemarks

Eine Warteschlange kann das Ziel einer SELECT-Anweisung sein.A queue can be the target of a SELECT statement. Der Inhalt einer Warteschlange kann jedoch nur mithilfe von Anweisungen geändert werden, die für Service BrokerService Broker-Konversationen verwendet werden, wie beispielsweise SEND, RECEIVE und END CONVERSATION.However, the contents of a queue can only be modified using statements that operate on Service BrokerService Broker conversations, such as SEND, RECEIVE, and END CONVERSATION. Eine Warteschlange kann nicht das Ziel einer INSERT-, UPDATE-, DELETE- oder TRUNCATE-Anweisung sein.A queue cannot be the target of an INSERT, UPDATE, DELETE, or TRUNCATE statement.

Eine Warteschlange ist möglicherweise kein temporäres Objekt.A queue might not be a temporary object. Daher sind Warteschlangennamen, die mit # beginnen, ungültig.Therefore, queue names starting with # are not valid.

Das Erstellen einer Warteschlange im inaktiven Status ermöglicht es Ihnen, die Infrastruktur für einen Dienst einzurichten, bevor der Empfang von Nachrichten in der Warteschlange zugelassen wird.Creating a queue in an inactive state lets you get the infrastructure in place for a service before allowing messages to be received on the queue.

Service BrokerService Broker beendet gespeicherte Aktivierungsprozeduren nicht, wenn sich keine Nachrichten in der Warteschlange befinden.does not stop activation stored procedures when there are no messages on the queue. Eine gespeicherte Aktivierungsprozedur sollte beendet werden, wenn eine kurze Zeit lang keine Nachrichten in der Warteschlange verfügbar sind.An activation stored procedure should exit when no messages are available on the queue for a short time.

Berechtigungen für die gespeicherte Aktivierungsprozedur werden überprüft, wenn Service BrokerService Broker die gespeicherte Prozedur startet, nicht, wenn die Warteschlange erstellt wird.Permissions for the activation stored procedure are checked when Service BrokerService Broker starts the stored procedure, not when the queue is created. Die CREATE QUEUE-Anweisung überprüft nicht, ob der in der EXECUTE AS-Klausel angegebene Benutzer über die Berechtigung verfügt, die in der PROCEDURE NAME-Klausel angegebene gespeicherte Prozedur auszuführen.The CREATE QUEUE statement does not verify that the user specified in the EXECUTE AS clause has permission to execute the stored procedure specified in the PROCEDURE NAME clause.

Ist eine Warteschlange nicht verfügbar, speichert Service BrokerService Broker Nachrichten für Dienste, die die Warteschlange verwenden, in der Übertragungswarteschlange für die Datenbank.When a queue is unavailable, Service BrokerService Broker holds messages for services that use the queue in the transmission queue for the database. Die sys.transmission_queue-Katalogsicht stellt eine Sicht der Übertragungswarteschlange bereit.The sys.transmission_queue catalog view provides a view of the transmission queue.

Eine Warteschlange ist ein Objekt, dessen Besitzer ein Schema ist.A queue is a schema-owned object. Warteschlangen werden in der sys.objects-Katalogsicht angezeigt.Queues appear in the sys.objects catalog view.

In der folgenden Tabelle werden die Spalten in einer Warteschlange aufgelistet.The following table lists the columns in a queue.

SpaltennameColumn name DatentypData type BESCHREIBUNGDescription
statusstatus tinyinttinyint Status der Nachricht.Status of the message. Die RECEIVE-Anweisung gibt alle Nachrichten zurück, die den Status 1 haben.The RECEIVE statement returns all messages that have a status of 1. Wenn die Nachrichtenbeibehaltung aktiviert ist, wird der Status auf 0 festgelegt.If message retention is on, the status is then set to 0. Wenn die Nachrichtenbeibehaltung deaktiviert ist, wird die Meldung aus der Warteschlange gelöscht.If message retention is off, the message is deleted from the queue. Nachrichten in der Warteschlange können einen der folgenden Werte enthalten:Messages in the queue can contain one of the following values:

0 = Empfangene Nachricht wurde beibehalten0=Retained received message

1 = Bereit zu empfangen1=Ready to receive

2 = Noch nicht abgeschlossen2=Not yet complete

3 = Gesendete Nachricht wurde beibehalten3=Retained sent message
prioritypriority tinyinttinyint Die Prioritätsebene, die der Nachricht zugewiesen wird.The priority level that is assigned to this message.
queuing_orderqueuing_order bigintbigint Fortlaufende Nummer der Nachricht in der Warteschlange.Message order number in the queue.
conversation_group_idconversation_group_id uniqueidentifieruniqueidentifier Bezeichner für die Konversationsgruppe, zu der diese Nachricht gehört.Identifier for the conversation group that this message belongs to.
conversation_handleconversation_handle uniqueidentifieruniqueidentifier Handle der Konversation, von der diese Nachricht ein Teil ist.Handle for the conversation that this message is part of.
message_sequence_numbermessage_sequence_number bigintbigint Sequenznummer der Nachricht in der Konversation.Sequence number of the message in the conversation.
service_nameservice_name nvarchar(512)nvarchar(512) Name des Diensts, an den die Konversation gerichtet ist.Name of the service that the conversation is to.
service_idservice_id intint SQL ServerSQL Server-Objektbezeichner des Diensts, an den die Konversation gerichtet ist.object identifier of the service that the conversation is to.
service_contract_nameservice_contract_name nvarchar(256)nvarchar(256) Name des Vertrags, dem die Konversation entspricht.Name of the contract that the conversation follows.
service_contract_idservice_contract_id intint SQL ServerSQL Server-Objektbezeichner des Vertrags, dem die Konversation entspricht.object identifier of the contract that the conversation follows.
message_type_namemessage_type_name nvarchar(256)nvarchar(256) Name des Nachrichtentyps, der die Nachricht beschreibt.Name of the message type that describes the message.
message_type_idmessage_type_id intint SQL ServerSQL Server-Objektbezeichner des Nachrichtentyps, der die Nachricht beschreibt.object identifier of the message type that describes the message.
validationvalidation nchar(2)nchar(2) Für die Nachricht verwendete Überprüfung.Validation used for the message.

E=LeerE=Empty

N = KeineN=None

X=XMLX=XML
message_bodymessage_body varbinary(max)varbinary(max) Inhalt der Nachricht.Content of the message.
message_idmessage_id uniqueidentifieruniqueidentifier Eindeutiger Bezeichner für die Nachricht.Unique identifier for the message.

BerechtigungenPermissions

Die Berechtigung zum Erstellen einer Warteschlange liegt bei Mitgliedern der festen Datenbankrollen db_ddladmin oder db_owner bzw. der festen Serverrolle sysadmin.Permission for creating a queue uses members of the db_ddladmin or db_owner fixed database roles, or the sysadmin fixed server role.

Die REFERENCES-Berechtigung für eine Warteschlange wird standardmäßig dem Besitzer der Warteschlange, den Mitgliedern der festen Datenbankrolle db_ddladmin oder db_owner bzw. den Mitgliedern der festen Serverrolle sysadmin zugewiesen.REFERENCES permission for a queue defaults to the owner of the queue, members of the db_ddladmin or db_owner fixed database roles, or members of the sysadmin fixed server role.

RECEIVE-Berechtigungen für eine Warteschlange liegen standardmäßig beim Besitzer der Warteschlange, bei Mitgliedern der festen Datenbankrolle db_owner oder bei Mitgliedern der festen Serverrolle sysadmin.RECEIVE permission for a queue defaults to the owner of the queue, members of the db_owner fixed database role, or members of the sysadmin fixed server role.

BeispieleExamples

A.A. Erstellen einer Warteschlange ohne ParameterCreating a queue with no parameters

Im folgenden Beispiel wird eine Warteschlange erstellt, die für den Empfang von Nachrichten verfügbar ist.The following example creates a queue that is available to receive messages. Für die Warteschlange wird keine gespeicherte Aktivierungsprozedur angegeben.No activation stored procedure is specified for the queue.

CREATE QUEUE ExpenseQueue ;

B.B. Erstellen einer nicht verfügbaren WarteschlangeCreating an unavailable queue

Im folgenden Beispiel wird eine Warteschlange erstellt, die nicht für den Empfang von Nachrichten verfügbar ist.The following example creates a queue that is unavailable to receive messages. Für die Warteschlange wird keine gespeicherte Aktivierungsprozedur angegeben.No activation stored procedure is specified for the queue.

CREATE QUEUE ExpenseQueue WITH STATUS=OFF ;

C.C. Erstellen einer Warteschlange und Angeben von internen AktivierungsinformationenCreating a queue and specify internal activation information

Im folgenden Beispiel wird eine Warteschlange erstellt, die für den Empfang von Nachrichten verfügbar ist.The following example creates a queue that is available to receive messages. Die Warteschlange startet die gespeicherte Prozedur expense_procedure, wenn eine Nachricht in der Warteschlange angeordnet wird.The queue starts the stored procedure expense_procedure when a message enters the queue. Die gespeicherte Prozedur wird als der Benutzer ExpenseUser ausgeführt.The stored procedure executes as the user ExpenseUser. Die Warteschlange startet ein Maximum von 5 Instanzen der gespeicherten Prozedur.The queue starts a maximum of 5 instances of the stored procedure.

CREATE QUEUE ExpenseQueue
    WITH STATUS=ON,
    ACTIVATION (
        PROCEDURE_NAME = expense_procedure
        , MAX_QUEUE_READERS = 5
        , EXECUTE AS 'ExpenseUser' ) ;

D:D. Erstellen einer Warteschlange in einer bestimmten DateigruppeCreating a queue on a specific filegroup

Im folgenden Beispiel wird eine Warteschlange in der ExpenseWorkFileGroup-Dateigruppe erstellt.The following example creates a queue on the filegroup ExpenseWorkFileGroup.

CREATE QUEUE ExpenseQueue
    ON ExpenseWorkFileGroup ;

E.E. Erstellen einer Warteschlange mit mehreren ParameternCreating a queue with multiple parameters

Im folgenden Beispiel wird eine Warteschlange in der DEFAULT-Dateigruppe erstellt.The following example creates a queue on the DEFAULT filegroup. Die Warteschlange ist nicht verfügbar.The queue is unavailable. Nachrichten werden in der Warteschlange beibehalten, bis die Konversation endet, zu der sie gehören.Messages are retained in the queue until the conversation that they belong to ends. Wenn die Warteschlange über ALTER QUEUE zur Verfügung gestellt wird, startet die Warteschlange die gespeicherte Prozedur 2008R2.dbo.expense_procedure für die Verarbeitung von Nachrichten.When the queue is made available through ALTER QUEUE, the queue starts the stored procedure 2008R2.dbo.expense_procedure to process messages. Die gespeicherte Prozedur wird als der Benutzer ausgeführt, der die CREATE QUEUE-Anweisung ausgeführt hat.The stored procedure executes as the user who ran the CREATE QUEUE statement. Die Warteschlange startet ein Maximum von 10 Instanzen der gespeicherten Prozedur.The queue starts a maximum of 10 instances of the stored procedure.

CREATE QUEUE ExpenseQueue
    WITH STATUS = OFF
      , RETENTION = ON
      , ACTIVATION (
          PROCEDURE_NAME = AdventureWorks2012.dbo.expense_procedure
          , MAX_QUEUE_READERS = 10
          , EXECUTE AS SELF )
    ON [DEFAULT];

Weitere InformationenSee Also