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

SE APLICA A: síSQL Server (a partir de 2008) noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Crea una nueva cola en una base de datos.Creates a new queue in a database. Las colas almacenan mensajes.Queues store messages. Cuando llega un mensaje para un servicio, Service BrokerService Broker lo coloca en la cola asociada a ese servicio.When a message arrives for a service, Service BrokerService Broker puts the message on the queue associated with the service.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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 }  
  

ArgumentosArguments

database_name (object)database_name (object)
Es el nombre de la base de datos en que se crea la nueva cola.Is the name of the database within which to create the new queue. database_name debe especificar el nombre de una base de datos existente.database_name must specify the name of an existing database. Si no se proporciona database_name, la cola se crea en la base de datos actual.When database_name is not provided, the queue is created in the current database.

schema_name (object)schema_name (object)
Nombre del esquema al que pertenece la nueva cola.Is the name of the schema to which the new queue belongs. El valor predeterminado del esquema es el esquema predeterminado del usuario que ejecuta la instrucción.The schema defaults to the default schema for the user that executes the statement. Si la instrucción CREATE QUEUE es ejecutada por un miembro del rol fijo de servidor sysadmin o por un miembro de los roles fijos de base de datos db_dbowner o db_ddladmin en la base de datos especificada por database_name, schema_name puede especificar un esquema distinto del asociado con el inicio de sesión de la conexión actual.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. De no ser así, schema_name debe ser el esquema predeterminado del usuario que ejecuta la instrucción.Otherwise, schema_name must be the default schema for the user who executes the statement.

queue_namequeue_name
Nombre de la cola que se va a crear.Is the name of the queue to create. Este nombre debe cumplir las directrices de los identificadores de SQL ServerSQL Server.This name must meet the guidelines for SQL ServerSQL Server identifiers.

STATUS (cola)STATUS (Queue)
Especifica si la cola está disponible (ON) o no (OFF).Specifies whether the queue is available (ON) or unavailable (OFF). Cuando la cola no está disponible, no pueden agregarse mensajes a ella ni tampoco quitarse.When the queue is unavailable, no messages can be added to the queue or removed from the queue. Puede crear la cola en un estado de no disponibilidad para impedir que lleguen mensajes a ésta hasta que la cola esté disponible mediante una instrucción ALTER QUEUE.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. Si se pasa por alto esta cláusula, el valor predeterminado es ON y la cola estará disponible.If this clause is omitted, the default is ON, and the queue is available.

RETENTIONRETENTION
Especifica la configuración de retención para la cola.Specifies the retention setting for the queue. Si RETENTION = ON, todos los mensajes enviados o recibidos relativos a conversaciones que utilizan esta cola se retendrán en ella hasta que finalicen las conversaciones.If RETENTION = ON, all messages sent or received on conversations that use this queue are retained in the queue until the conversations have ended. Esto permite retener mensajes con fines de auditoría o para realizar transacciones de compensación si se produce un error.This lets you retain messages for auditing purposes, or to perform compensating transactions if an error occurs. Si no se especifica esta cláusula, el valor predeterminado de retención es OFF.If this clause is not specified, the retention setting defaults to OFF.

Nota

El rendimiento puede disminuir si se establece RETENTION en ON.Setting RETENTION = ON can decrease performance. Utilice este valor solo si lo requiere la aplicación.This setting should only be used if it is required for the application.

ACTIVATIONACTIVATION
Especifica información sobre qué procedimiento almacenado es necesario iniciar para procesar los mensajes de esta cola.Specifies information about which stored procedure you have to start to process messages in this queue.

STATUS (activación) STATUS (Activation)
Especifica si Service BrokerService Broker inicia el procedimiento almacenado.Specifies whether Service BrokerService Broker starts the stored procedure. Si STATUS = ON, la cola inicia el procedimiento almacenado especificado con PROCEDURE_NAME cuando el número de procedimientos que se ejecutan actualmente es menor que MAX_QUEUE_READERS y cuando los mensajes llegan a la cola antes de que los procedimientos almacenados reciban mensajes.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. Si STATUS = OFF, la cola no inicia el procedimiento almacenado.When STATUS = OFF, the queue does not start the stored procedure. Si no se especifica esta cláusula, el valor predeterminado es ON.If this clause is not specified, the default is ON.

PROCEDURE_NAME = <procedure>PROCEDURE_NAME = <procedure>
Especifica el nombre del procedimiento almacenado que es necesario iniciar para procesar mensajes en esta cola.Specifies the name of the stored procedure to start to process messages in this queue. Este valor debe ser un identificador de SQL ServerSQL Server.This value must be a SQL ServerSQL Server identifier.

database_name(procedure)database_name(procedure)
Nombre de la base de datos que contiene el procedimiento almacenado.Is the name of the database that contains the stored procedure.

schema_name(procedure)schema_name(procedure)
Es el nombre del esquema que contiene el procedimiento almacenado.Is the name of the schema that contains the stored procedure.

procedure_nameprocedure_name
Es el nombre del procedimiento almacenado.Is the name of the stored procedure.

MAX_QUEUE_READERS =max_readersMAX_QUEUE_READERS =max_readers
Especifica el número máximo de instancias del procedimiento almacenado de activación que la cola inicia al mismo tiempo.Specifies the maximum number of instances of the activation stored procedure that the queue starts at the same time. El valor de max_readers debe ser un número comprendido entre 0 y 32767.The value of max_readers must be a number between 0 and 32767.

EXECUTE ASEXECUTE AS
Especifica la cuenta de usuario de base de datos de SQL ServerSQL Server en la que se ejecuta el procedimiento almacenado de activación.Specifies the SQL ServerSQL Server database user account under which the activation stored procedure runs. SQL ServerSQL Server debe poder comprobar los permisos de este usuario en el momento en que la cola inicia el procedimiento almacenado.must be able to check the permissions for this user at the time that the queue starts the stored procedure. En el caso de un usuario de dominio, el servidor debe estar conectado al dominio cuando se inicie el procedimiento o se producirá un error en la activación.For a domain user, the server must be connected to the domain when the procedure is started or activation fails. En usuarios de SQL ServerSQL Server, el servidor siempre puede comprobar los permisos.For a SQL ServerSQL Server user, the server can always check permissions.

SELFSELF
Especifica que el procedimiento almacenado se ejecuta como el usuario actual.Specifies that the stored procedure executes as the current user. Es la entidad de seguridad de base de datos que ejecuta esta instrucción CREATE QUEUE.(The database principal executing this CREATE QUEUE statement.)

'user_name''user_name'
Es el nombre del usuario con el que se ejecuta el procedimiento almacenado.Is the name of the user who the stored procedure executes as. El parámetro user_name debe ser un usuario de SQL ServerSQL Server válido especificado como identificador de SQL ServerSQL Server.The user_name parameter must be a valid SQL ServerSQL Server user specified as a SQL ServerSQL Server identifier. El usuario actual debe tener el permiso IMPERSONATE para el valor de user_name especificado.The current user must have IMPERSONATE permission for the user_name specified.

OWNEROWNER
Especifica que el procedimiento almacenado se ejecuta como el propietario de la cola.Specifies that the stored procedure executes as the owner of the queue.

POISON_MESSAGE_HANDLINGPOISON_MESSAGE_HANDLING
Especifica si está habilitado para la cola el control de mensajes dudosos.Specifies whether poison message handling is enabled for the queue. El valor predeterminado es ON.The default is ON.

Una cola que tenga configurado en OFF el control de mensajes dudosos no se deshabilitará después de cinco reversiones de transacción consecutivas.A queue that has poison message handling set to OFF will not be disabled after five consecutive transaction rollbacks. Esto permite que el sistema de control de mensajes dudosos sea definido por la aplicación.This allows for a custom poison message handing system to be defined by the application.

ON filegroup | [DEFAULT]ON filegroup | [DEFAULT]
Especifica el grupo de archivos de SQL ServerSQL Server en que se va a crear esta cola.Specifies the SQL ServerSQL Server filegroup on which to create this queue. Puede usar el parámetro filegroup para identificar un grupo de archivos o emplear el identificador DEFAULT para usar el grupo de archivos predeterminado de la base de datos de Service Broker.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. En el contexto de esta cláusula, DEFAULT no es una palabra clave y debe delimitarse como un identificador.In the context of this clause, DEFAULT is not a keyword, and must be delimited as an identifier. Si no se especifica ningún grupo de archivos, la cola utiliza el grupo de archivos predeterminado de la base de datos.When no filegroup is specified, the queue uses the default filegroup for the database.

NotasRemarks

Una cola puede ser el destino de una instrucción SELECT.A queue can be the target of a SELECT statement. No obstante, el contenido de una cola solo puede modificarse mediante instrucciones que funcionan en conversaciones de Service BrokerService Broker, como SEND, RECEIVE y 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. Una cola no puede ser el destino de una instrucción INSERT, UPDATE, DELETE o TRUNCATE.A queue cannot be the target of an INSERT, UPDATE, DELETE, or TRUNCATE statement.

Una cola no puede ser un objeto temporal.A queue might not be a temporary object. Por lo tanto, los nombres de cola que empiezan por # no son válidos.Therefore, queue names starting with # are not valid.

Si crea una cola en estado inactivo, puede obtener la infraestructura de un servicio antes de permitir que los mensajes se reciban en la cola.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 no detiene los procedimientos almacenados de activación si no hay ningún mensaje en la cola.does not stop activation stored procedures when there are no messages on the queue. Un procedimiento almacenado de activación debe finalizar cuando no haya ningún mensaje disponible en la cola durante un breve período de tiempo.An activation stored procedure should exit when no messages are available on the queue for a short time.

Los permisos para el procedimiento almacenado de activación se comprueban cuando Service BrokerService Broker inicia el procedimiento almacenado, no cuando se crea la cola.Permissions for the activation stored procedure are checked when Service BrokerService Broker starts the stored procedure, not when the queue is created. La instrucción CREATE QUEUE no comprueba que el usuario especificado en la cláusula EXECUTE AS tenga permiso para ejecutar el procedimiento almacenado especificado en la cláusula PROCEDURE NAME.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.

Cuando una cola no está disponible, Service BrokerService Broker retiene los mensajes de los servicios que usan la cola en la cola de transmisión de la base de datos.When a queue is unavailable, Service BrokerService Broker holds messages for services that use the queue in the transmission queue for the database. La vista de catálogo sys.transmission_queue proporciona una vista de la cola de transmisión.The sys.transmission_queue catalog view provides a view of the transmission queue.

Una cola es un objeto propiedad de un esquema.A queue is a schema-owned object. Las colas aparecen en la vista de catálogo sys.objects.Queues appear in the sys.objects catalog view.

La siguiente tabla contiene las columnas de una cola.The following table lists the columns in a queue.

Nombre de columnaColumn name Tipo de datosData type DescripciónDescription
statusstatus tinyinttinyint Estado del mensaje.Status of the message. La instrucción RECEIVE devuelve todos los mensajes que tienen 1 como estado.The RECEIVE statement returns all messages that have a status of 1. Si la retención de los mensajes está activada, el estado se establece en 0.If message retention is on, the status is then set to 0. Si está desactivada, el mensaje se elimina de la cola.If message retention is off, the message is deleted from the queue. Los mensajes de la cola pueden contener uno de los valores siguientes:Messages in the queue can contain one of the following values:

0=Mensaje recibido retenido0=Retained received message

1=Listo para recibir1=Ready to receive

2=Sin completar2=Not yet complete

3=Mensaje enviado retenido3=Retained sent message
prioritypriority tinyinttinyint Nivel de prioridad asignado a este mensaje.The priority level that is assigned to this message.
queuing_orderqueuing_order bigintbigint Número de orden del mensaje en la cola.Message order number in the queue.
conversation_group_idconversation_group_id uniqueidentifieruniqueidentifier Identificador para el grupo de conversación al que pertenece este mensaje.Identifier for the conversation group that this message belongs to.
conversation_handleconversation_handle uniqueidentifieruniqueidentifier Identificador para la conversación de la que forma parte este mensaje.Handle for the conversation that this message is part of.
message_sequence_numbermessage_sequence_number bigintbigint Número de secuencia del mensaje en la conversación.Sequence number of the message in the conversation.
service_nameservice_name nvarchar(512)nvarchar(512) Nombre del servicio al que se destina la conversación.Name of the service that the conversation is to.
service_idservice_id intint Identificador de objeto de SQL ServerSQL Server del servicio al que se destina la conversación.SQL ServerSQL Server object identifier of the service that the conversation is to.
service_contract_nameservice_contract_name nvarchar(256)nvarchar(256) Nombre del contrato por el que se rige la conversación.Name of the contract that the conversation follows.
service_contract_idservice_contract_id intint Identificador de objeto de SQL ServerSQL Server del contrato por el que se rige la conversación.SQL ServerSQL Server object identifier of the contract that the conversation follows.
message_type_namemessage_type_name nvarchar(256)nvarchar(256) Nombre del tipo de mensaje que describe el mensaje.Name of the message type that describes the message.
message_type_idmessage_type_id intint Identificador de objeto de SQL ServerSQL Server del tipo de mensaje que describe el mensaje.SQL ServerSQL Server object identifier of the message type that describes the message.
validationvalidation nchar(2)nchar(2) Validación utilizada para el mensaje.Validation used for the message.

E=EmptyE=Empty

N=NoneN=None

X=XMLX=XML
message_bodymessage_body varbinary(max)varbinary(max) Contenido del mensaje.Content of the message.
message_idmessage_id uniqueidentifieruniqueidentifier Identificador único para el mensaje.Unique identifier for the message.

PermisosPermissions

Tienen permiso para crear una cola los miembros de los roles fijos de base de datos db_ddladmin o db_owner y el rol fijo de servidor sysadmin.Permission for creating a queue uses members of the db_ddladmin or db_owner fixed database roles and the sysadmin fixed server role.

De forma predeterminada, tienen permiso REFERENCES en una cola el propietario de ésta, los miembros los roles fijos de base de datos db_ddladmin o db_owner y los miembros del rol fijo de servidor sysadmin.REFERENCES permission for a queue defaults to the owner of the queue, members of the db_ddladmin or db_owner fixed database roles, and members of the sysadmin fixed server role.

De forma predeterminada, tienen permiso RECEIVE en una cola el propietario de ésta, los miembros del rol fijo de base de datos db_owner y los miembros del rol fijo de servidor sysadmin.RECEIVE permission for a queue defaults to the owner of the queue, members of the db_owner fixed database role, and members of the sysadmin fixed server role.

EjemplosExamples

A.A. Crear una cola sin parámetrosCreating a queue with no parameters

En el siguiente ejemplo se crea una cola que está disponible para recibir mensajes.The following example creates a queue that is available to receive messages. No se especifica ningún procedimiento almacenado de activación para la cola.No activation stored procedure is specified for the queue.

CREATE QUEUE ExpenseQueue ;  

B.B. Crear una cola no disponibleCreating an unavailable queue

En el siguiente ejemplo se crea una cola que no está disponible para recibir mensajes.The following example creates a queue that is unavailable to receive messages. No se especifica ningún procedimiento almacenado de activación para la cola.No activation stored procedure is specified for the queue.

CREATE QUEUE ExpenseQueue WITH STATUS=OFF ;  

C.C. Crear una cola y especificar información de activación internaCreating a queue and specify internal activation information

En el siguiente ejemplo se crea una cola que está disponible para recibir mensajes.The following example creates a queue that is available to receive messages. La cola inicia el procedimiento almacenado expense_procedure cuando un mensaje entra en la cola.The queue starts the stored procedure expense_procedure when a message enters the queue. El procedimiento almacenado se ejecuta como el usuario ExpenseUser.The stored procedure executes as the user ExpenseUser. La cola inicia un máximo de 5 instancias del procedimiento almacenado.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. Crear una cola en un grupo de archivos específicoCreating a queue on a specific filegroup

En el siguiente ejemplo se crea una cola en el grupo de archivos ExpenseWorkFileGroup.The following example creates a queue on the filegroup ExpenseWorkFileGroup.

CREATE QUEUE ExpenseQueue  
    ON ExpenseWorkFileGroup ;  

E.E. Crear una cola con varios parámetrosCreating a queue with multiple parameters

En el siguiente ejemplo se crea una cola en el grupo de archivos DEFAULT.The following example creates a queue on the DEFAULT filegroup. La cola no está disponible.The queue is unavailable. Los mensajes se retienen en la cola hasta que finaliza la conversación a la que pertenecen.Messages are retained in the queue until the conversation that they belong to ends. Cuando la cola pasa a estar disponible mediante ALTER QUEUE, la cola inicia el procedimiento almacenado 2008R2.dbo.expense_procedure para procesar los mensajes.When the queue is made available through ALTER QUEUE, the queue starts the stored procedure 2008R2.dbo.expense_procedure to process messages. El procedimiento almacenado se ejecuta como el usuario que ejecutó la instrucción CREATE QUEUE.The stored procedure executes as the user who ran the CREATE QUEUE statement. La cola inicia un máximo de 10 instancias del procedimiento almacenado.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] ;  

Consulte tambiénSee Also

ALTER QUEUE (Transact-SQL) ALTER QUEUE (Transact-SQL)
CREATE SERVICE (Transact-SQL) CREATE SERVICE (Transact-SQL)
DROP QUEUE (Transact-SQL) DROP QUEUE (Transact-SQL)
RECEIVE (Transact-SQL) RECEIVE (Transact-SQL)
EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)