(Transact-sql) alma
Bir veya daha fazla ileti sıradan alır. Bağlı saklama sıranın, iletiyi sıradan kaldırır veya ileti sırasındaki durumunu güncelleştirir.
Transact-SQL Sözdizim Kuralları
Sözdizimi
[ WAITFOR ( ]
RECEIVE [ TOP ( n ) ]
<column_specifier> [ ,...n ]
FROM <queue>
[ INTO table_variable ]
[ WHERE { conversation_handle = conversation_handle
| conversation_group_id = conversation_group_id } ]
[ ) ] [ , TIMEOUT timeout ]
[ ; ]
<column_specifier> ::=
{ *
| { column_name | [ ] expression } [ [ AS ] column_alias ]
| column_alias = expression
} [ ,...n ]
<queue> ::=
{
[ database_name . [ schema_name ] . | schema_name . ]
queue_name
}
Bağımsız değişkenler
WAITFOR
Hiçbir ileti şu anda varsa Al deyimi üzerinde sıra geldiğinde bir ileti bekler belirtir.TOP( n )
Döndürülen iletilerin sayısını belirtir. Bu yan tümcesi belirtilirse, bu deyimi ölçüte uyan tüm iletiler döndürülür.*
Sonuç kümesi sıradaki tüm sütunlar içerdiğini belirtir.column_name
Bir sütunun sonuç içerecek şekilde ayarlayın.expression
Bir sütun adı, sabit, işlev veya sütun adları, sabitleri ve işlevleri tarafından bir işleç bağlı herhangi bir birleşimi.column_alias
Sonuç kümesinde sütun adını değiştirmek için diğer bir ad.Kaynak
Almak için iletileri içeren sıra belirtir.database_name
İleti almak için sıra içeren veritabanının adı. Hayır database namesağlanır, geçerli veritabanının varsayılan.schema_name
İleti almak için sıra sahibi olan şema adı. Hayır schema namesağlanır, geçerli kullanıcı için varsayılan şema varsayılanlara.queue_name
İleti almak için sıra adı.İÇİNEtable_variable
İletilere alma yerleri tablo değişkeni belirtir. Tablo değişkeni olarak iletileri sütun sayısı aynı olması gerekir. Tablo değişkeni her sütunun veri türü mesajlar ilgili sütunun veri türüne örtük olarak dönüştürülebilir olmalıdır. Hedef belirtilmezse, iletileri kümesi sonucu döndürülür.BURADA
Konuşma veya konuşma Grup alınan iletileri belirtir. Belirtilmezse, bir sonraki kullanılabilir konuşma grubundan iletileri verir.conversation_handle =conversation_handle
Konuşma için alınan iletileri belirtir. conversation handleMutlaka sağlanan olmak bir uniqueidentifer, ya da Cabrio için bir türü uniqueidentifier.conversation_group_id =conversation_group_id
Alınan iletiler için konuşma grubu belirtir. conversation group ID that isMutlaka sağlanan olmak bir uniqueidentifier, ya da bir tür Cabrio uniqueidentifier.ZAMAN AŞIMItimeout
Deyimi bir ileti için beklenecek milisaniye cinsinden süre miktarını belirtir. Bu yan tümcesi yalnızca WAITFOR yan tümcesinde kullanılır. Bu yan belirtilmemiş veya zaman aşımı -1, bekleme süresi sınırsızdır. Zaman aşımı süresi dolarsa, Al bir boş sonuç kümesi döndürür.
Açıklamalar
Önemli |
---|
Al deyimi ilk deyimi bir toplu iş veya saklı yordam değilse, önceki deyimi bir noktalı virgülle sona gerekir (;). |
Al deyimi bir sıradan iletileri okur ve bir sonuç kümesi verir. Sonuç kümesi, her biri tek bir ileti içeren sıfır veya daha fazla satır, oluşur. INTO yan kullanılmazsa, ve column_specifierdeğerleri atamaz Yerel değişkenler için deyimi döndürür bir sonuç kümesi arama programı.
Al deyimi tarafından döndürülen iletileri farklı ileti türleri olabilir. Uygulamaları kullanarak message_type_name bu kodu her ileti yönlendirmek için sütun ilişkili ileti türünü işler. İki sınıf ileti türleri vardır:
create message type deyimi kullanılarak oluşturulan uygulama tanımlı ileti türleri. Konuşmada izin verilen uygulama tanımlı ileti türleri kümesi tarafından tanımlanan Service Brokerkonuşma için belirtilen sözleşme.
Service BrokerSistem bu durum ya da hata bilgi mesajları.
Sıranın ileti saklama belirtmediği sürece Al deyimi alınan iletilerin sıradan kaldırır. Sıra saklama ayarı on, Al deyimi güncelleştirmeleri olduğunda durum sütun 0 ve sıradaki iletileri bırakır. Al deyimi içeren bir hareketi geri alır, işlem sırasındaki tüm değişiklikleri de geri dönen iletiler sıraya alınır.
Al deyimi tarafından döndürülen tüm iletileri aynı konuşma grubuna aittir. Al deyimi konuşma group deyimi içeren işlem bitene kadar döndürülen iletilerin kilitler. İletileri al deyimi döndürür bir durum , 1. Al deyimi tarafından döndürülen sonuç kümesi örtülü olarak sıralanır:
İletileri birden çok konuşmaları where yan tümcesinde koşulları karşılamıyorsa, iletileri başka bir konuşma için verir önce Al deyimi bir konuşma tüm iletileri verir. Konuşma öncelik düzeyi azalan sırayla işlenir.
Belirli bir konuşma için artan iletileri al deyimi döndürür message_sequence_number sipariş.
Al deyimi where yan tümcesi yalnızca ya da kullanan bir arama koşulu içeren conversation_handle veya conversation_group_id. Arama koşulu bir veya daha fazla sırayı diğer sütunlarda içeremez. Conversation_handle veya conversation_group_id bir deyim olamaz. Döndürülen iletileri kümesi, where yan tümcesinde belirtilen koşullara bağlıdır:
Eğer conversation_handle belirtilirse, alma, gelen belirtilen konuşma sırasındaki kullanılabilir tüm iletiler döndürür.
Eğer conversation_group_id belirtilirse, Al belirtilen konuşma grubu üyesi olan herhangi bir konuşma sıradan bulunan tüm iletiler döndürür.
where yan ise, hangi görüşme Grup alma belirler:
Bir veya daha fazla ileti sırasına sahiptir.
Başka bir Al deyimi tarafından kilitlenmiş değil.
Bu ölçütlere uyan tüm konuşma gruplar en yüksek öncelik düzeyi vardır.
Al sonra seçilen konuşma grubu üyesi olan herhangi bir konuşma tüm iletileri sırada kullanılabilir verir.
Konuşma tutamacını veya where yan tümcesi yok veya değil de belirtilen konuşma Grup tanımlayıcısını belirtilen sırayla ilişkili, Al deyimi, bir hata döndürür.
Al deyimi içinde belirtilen sıra off için ayarlanmış sıra durumu varsa, deyimi ile başarısız bir Transact-SQLhata.
WAITFOR yan tümcesi belirtildiğinde, belirtilen zaman aşımı için bekler veya kadar bir sonuç kümesi kullanılabilir. Sıraya düştü ya da açıklama bekliyor iken sırasının durumunu off için ayarlanır, deyimi hemen bir hata döndürür. Bu görüşme bırakılan ya da başka bir sıraya taşındı bir görüşme Grup veya konuşma tanıtıcı ve hizmeti Al deyimi belirtir, Al deyimi raporları bir Transact-SQLhata.
ALMA kullanıcı tanımlı bir işlev geçerli değil.
Al deyimi hiçbir öncelik açlık önleme sahiptir. Tek Al deyimi bir görüşme Grup kilitleri ve düşük öncelikli konuşmaları iletileri bir sürü alır, hiçbir ileti öncelik konuşmaları grubunda alınabilir. Düşük öncelikli konuşmaları iletilerini alırken bunu önlemek için mesaj her Al deyimi tarafından adresinden alındı sınırlamak için top yan tümcesi kullanın.
Sıra sütunlar
Aşağıdaki tablo, sıra sütunları listeler:
Sütun adı |
Veri türü |
Açıklama |
---|---|---|
durumu |
tinyint |
İletinin durumunu. Al komutu tarafından döndürülen iletilerin her zaman durumu ise 0. Sıradaki iletileri aşağıdaki değerlerden birini içerebilir: 0Hazır =1alınan ileti =2henüz tam = değil3= Retained gönderilen ileti |
öncelik |
tinyint |
İleti için uygulanan konuşma öncelik düzeyi. |
queuing_order |
bigint |
Sırasındaki ileti sipariş numarası. |
conversation_group_id |
uniqueidentifier |
Bu iletiye ait olduğu konuşma grubu için tanımlayıcı. |
conversation_handle |
uniqueidentifier |
Bu ileti parçası olan konuşma tanıtıcı. |
message_sequence_number |
bigint |
Konuşma iletinin sıra numarası. |
HİZMET_ADI |
nvarchar(512) |
Bu görüşme için hizmet adı. |
service_id |
int |
SQL ServerBu görüşme için hizmet nesne tanımlayıcısı. |
service_contract_name |
nvarchar(256) |
Görüşme izleyen sözleşme adı. |
service_contract_id |
int |
SQL Servergörüşme izleyen sözleşme nesne tanımlayıcısı. |
message_type_name |
nvarchar(256) |
İletinin biçimini tanımlayan ileti türü adı. İletileri, uygulama ileti türleri veya Broker sistem iletilerini olabilir. |
message_type_id |
int |
SQL Servernesne tanımlayıcısı ileti türü ileti açıklar. |
doğrulama |
nchar(2) |
İleti için kullanılacak doğrulama. E=EmptyN=NoneX=XML |
message_body |
varbinary(MAX) |
İletinin içeriği. |
İzinler
Bir ileti almak için geçerli kullanıcı üzerinde sıraya Al izni olmalıdır.
Örnekler
A.Tüm iletiler için tüm sütunları bir görüşme Grup alma
Aşağıdaki örnek sonraki kullanılabilir konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. Açıklamada, iletiler sonuç olarak ayarlamak döndürür.
RECEIVE * FROM ExpenseQueue ;
RECEIVE * FROM ExpenseQueue ;
B.Alıcı belirtilen sütunlar konuşma grubundaki tüm iletileri için
Aşağıdaki örnek sonraki kullanılabilir konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. İletiler sonuç olarak ayarlamak sütun içeren deyimi döndürür conversation_handle, message_type_name, ve message_body.
RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;
RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;
C.İlk kullanılabilir ileti sıraya alma
Aşağıdaki örnekte ilk kullanılabilir iletisinden alır ExpenseQueuesonucunda kümesi sıra.
RECEIVE TOP (1) * FROM ExpenseQueue ;
RECEIVE TOP (1) * FROM ExpenseQueue ;
D.Belirli bir konuşma için tüm iletileri alma
Aşağıdaki örnek belirtilen konuşma için tüm kullanılabilir iletilerini alır ExpenseQueueSonuç olarak set kuyruk.
DECLARE @conversation_handle UNIQUEIDENTIFIER ;
SET @conversation_handle = <retrieve conversation from database> ;
RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;
DECLARE @conversation_handle UNIQUEIDENTIFIER ;
SET @conversation_handle = <retrieve conversation from database> ;
RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;
E.Belirtilen konuşma grubu iletileri alma
Aşağıdaki örnek belirtilen konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueueSonuç olarak set kuyruk.
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
SET @conversation_group_id =
<retrieve conversation group ID from database> ;
RECEIVE *
FROM ExpenseQueue
WHERE conversation_group_id = @conversation_group_id ;
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
SET @conversation_group_id =
<retrieve conversation group ID from database> ;
RECEIVE *
FROM ExpenseQueue
WHERE conversation_group_id = @conversation_group_id ;
F.Tablo değişkeni alma
Aşağıdaki örnek belirtilen konuşma grubundan için tüm kullanılabilir iletilerini alır ExpenseQueuetablo değişkeni kuyruğa.
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
DECLARE @procTable TABLE(
service_instance_id UNIQUEIDENTIFIER,
handle UNIQUEIDENTIFIER,
message_sequence_number BIGINT,
service_name NVARCHAR(512),
service_contract_name NVARCHAR(256),
message_type_name NVARCHAR(256),
validation NCHAR,
message_body VARBINARY(MAX)) ;
SET @conversation_group_id = <retrieve conversation group ID from database> ;
RECEIVE TOP (1)
conversation_group_id,
conversation_handle,
message_sequence_number,
service_name,
service_contract_name,
message_type_name,
validation,
message_body
FROM ExpenseQueue
INTO @procTable
WHERE conversation_group_id = @conversation_group_id ;
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;
DECLARE @procTable TABLE(
service_instance_id UNIQUEIDENTIFIER,
handle UNIQUEIDENTIFIER,
message_sequence_number BIGINT,
service_name NVARCHAR(512),
service_contract_name NVARCHAR(256),
message_type_name NVARCHAR(256),
validation NCHAR,
message_body VARBINARY(MAX)) ;
SET @conversation_group_id = <retrieve conversation group ID from database> ;
RECEIVE TOP (1)
conversation_group_id,
conversation_handle,
message_sequence_number,
service_name,
service_contract_name,
message_type_name,
validation,
message_body
FROM ExpenseQueue
INTO @procTable
WHERE conversation_group_id = @conversation_group_id ;
G.Alma ve süresiz bekleniyor
Aşağıdaki örnek bir sonraki kullanılabilir konuşma Grup tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. Deyim bekler, en az bir ileti kullanılabilir sonra tüm ileti sütunlarını içeren bir sonuç kümesi döndürür.
WAITFOR (
RECEIVE *
FROM ExpenseQueue) ;
WAITFOR (
RECEIVE *
FROM ExpenseQueue) ;
H.Alma ve belirtilen aralık için bekleniyor
Aşağıdaki örnek bir sonraki kullanılabilir konuşma Grup tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. İçin 60 saniye ya da en azından bir ileti kullanılabilir hale gelinceye kadar hangisi ilk olursa deyimi bekler. Deyimi en az bir mesaj varsa tüm ileti sütunlarını içeren bir sonuç kümesi döndürür. Aksi takdirde, deyimi boş sonuç kümesi döndürür.
WAITFOR (
RECEIVE *
FROM ExpenseQueue ),
TIMEOUT 60000 ;
WAITFOR (
RECEIVE *
FROM ExpenseQueue ),
TIMEOUT 60000 ;
I.Bir sütunun türünü değiştirme, iletileri alma
Aşağıdaki örnek bir sonraki kullanılabilir konuşma Grup tüm kullanılabilir iletilerini alır ExpenseQueuekuyruğu. İletiyi bir xml belgesi içeren ileti türünü belirtir, deyimi ileti gövdesi xml biçimine dönüştürür.
WAITFOR (
RECEIVE message_type_name,
CASE
WHEN validation = 'X' THEN CAST(message_body as XML)
ELSE NULL
END AS message_body
FROM ExpenseQueue ),
TIMEOUT 60000 ;
WAITFOR (
RECEIVE message_type_name,
CASE
WHEN validation = 'X' THEN CAST(message_body as XML)
ELSE NULL
END AS message_body
FROM ExpenseQueue ),
TIMEOUT 60000 ;
J.Konuşma durumu alınırken ileti gövdesinden veri ayıklarken, bir ileti alma
Aşağıdaki örnek aldığı bir sonraki kullanılabilir konuşma Grup kullanılabilir bir sonraki iletiye ExpenseQueuekuyruğu. İleti türü ne zaman //Adventure-Works.com/Expenses/SubmitExpense, ileti gövdesinden deyimi çalışan kimliği ve öğelerin listesini ayıklar. Deyimi de görüşme durumunu alır ConversationStatetablosu.
WAITFOR(
RECEIVE
TOP(1)
message_type_name,
COALESCE(
(SELECT TOP(1) ConversationState
FROM CurrentConversations AS cc
WHERE cc.ConversationHandle = conversation_handle),
'NEW')
AS ConversationState,
COALESCE(
(SELECT TOP(1) ErrorCount
FROM CurrentConversations AS cc
WHERE cc.ConversationHandle = conversation_handle),
0)
AS ConversationErrors,
CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'
THEN CAST(message_body AS XML).value(
'declare namespace rpt = "http://Adventure-Works.com/schemas/expenseReport"
(/rpt:ExpenseReport/rpt:EmployeeID)[1]', 'nvarchar(20)')
ELSE NULL
END AS EmployeeID,
CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'
THEN CAST(message_body AS XML).query(
'declare namespace rpt = "http://Adventure-Works.com/schemas/expenseReport"
/rpt:ExpenseReport/rpt:ItemDetail')
ELSE NULL
END AS ItemList
FROM ExpenseQueue
), TIMEOUT 60000 ;
WAITFOR(
RECEIVE
TOP(1)
message_type_name,
COALESCE(
(SELECT TOP(1) ConversationState
FROM CurrentConversations AS cc
WHERE cc.ConversationHandle = conversation_handle),
'NEW')
AS ConversationState,
COALESCE(
(SELECT TOP(1) ErrorCount
FROM CurrentConversations AS cc
WHERE cc.ConversationHandle = conversation_handle),
0)
AS ConversationErrors,
CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'
THEN CAST(message_body AS XML).value(
'declare namespace rpt = "http://Adventure-Works.com/schemas/expenseReport"
(/rpt:ExpenseReport/rpt:EmployeeID)[1]', 'nvarchar(20)')
ELSE NULL
END AS EmployeeID,
CASE WHEN message_type_name = N'//Adventure-Works.com/Expenses/SubmitExpense'
THEN CAST(message_body AS XML).query(
'declare namespace rpt = "http://Adventure-Works.com/schemas/expenseReport"
/rpt:ExpenseReport/rpt:ItemDetail')
ELSE NULL
END AS ItemList
FROM ExpenseQueue
), TIMEOUT 60000 ;
Ayrıca bkz.
Başvuru
BEGIN DIALOG konuşma (Transact-sql)
Konuşma süreölçer (Transact-sql) başlar
Sözleşme (Transact-sql) oluştur