Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server Azure SQL Yönetilen Örneği
Bir kuyruktan bir veya daha fazla mesajı alır. Kuyruğun saklama ayarına bağlı olarak, ya mesajı kuyruktan kaldırır ya da kuyruk içindeki mesajın durumunu günceller.
Transact-SQL söz dizimi kuralları
Syntax
[ 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 ]
} [ ,...n ]
<queue> ::=
{ database_name.schema_name.queue_name | schema_name.queue_name | queue_name }
Arguments
WAITFOR
Şu anda hiç mesaj yoksa, ilanın RECEIVE kuyruğun içine bir mesaj gelmesini beklediğini belirtir.
TOP( n )
Geri dönecek maksimum mesaj sayısını belirtir. Bu madde belirtilmemişse, ifade kriterlerini karşılayan tüm mesajlar geri gönderilir.
column_specifier
*
Sonuç kümesinin kuyruktaki tüm sütunları içerdiğini belirtir.
column_name
Sonuç kümesine dahil edilecek bir sütunun adı.
expression
Bir sütun adı, sabit, fonksiyon veya operatörle bağlantılı herhangi bir sütun isimleri, sabitleri ve fonksiyonların kombinasyonu.
column_alias
Sonuç kümesinde sütun adının yerine alternatif bir isim.
FROM
Alınacak mesajları içeren kuyruk belirtilir.
database_name
Mesaj alınacak kuyruğu içeren veritabanının adı.
Veritabanı adı verilmediğinde, mevcut veritabanı varsayılan olarak kullanılır.
schema_name
Mesaj almak için kuyruğu alan şemanın adı. Şema adı verilmediğinde, mevcut kullanıcı için varsayılan şema tercih edilir.
queue_name
Mesaj alınacak kuyruğun adı.
INTO table_variable
Mesajları yerleştiren tablo değişkenini RECEIVE belirtir. Tablo değişkeninin mesajlarda bulunan sütun sayısına sahip olması gerekir. Tablo değişkenindeki her sütunun veri tipi, mesajlardaki ilgili sütunun veri tipine örtük olarak dönüştürülebilir olmalıdır. INTO belirtilmemişse, mesajlar sonuç kümesi olarak döner.
WHERE
Alınan mesajlar için konuşma veya sohbet grubunu belirtir. Eğer atlanırsa, bir sonraki mevcut konuşma grubundan mesajlar döner.
conversation_handle = conversation_handle
Alınan mesajlar için konuşmayı belirtir. Sağlanan konuşma adı bir uniqueidentifier veya uniqueidentifier'a dönüştürülebilen bir tür olmalıdır.
conversation_group_id = conversation_group_id
Alınan mesajlar için konuşma grubunu belirtir. Sağlanan konuşma grubu kimliği , bir uniqueidentifier veya uniqueidentifier'a dönüştürülebilir bir tür olmalıdır.
MOLA VERME
Bir mesajı bekleme süresini, milisaniye cinsinden belirtir. Bu madde yalnızca WAITFOR maddesiyle kullanılabilir. Bu madde belirtilmemişse veya zaman aşımı -1, bekleme süresi sınırsızdır. Zaman aşımı dönerse, RECEIVE boş bir sonuç kümesi döner.
Remarks
Important
Eğer ifade, RECEIVE bir toplu veya saklanan prosedürün ilk ifadesi değilse, önceki ifadenin noktalı virgül (;)) ile sonlandırılması gerekir.
Bu ifade RECEIVE bir kuyruktan mesajları okur ve bir sonuç kümesi döndürür. Sonuç kümesi, her biri bir mesaj içeren sıfır veya daha fazla satırdan oluşur. INTO cümlesi kullanılmazsa ve column_specifier değerleri yerel değişkenlere atamıyorsa, ifade, çağıran programa bir sonuç kümesi döndürür.
Ifadenin RECEIVE geri dönen mesajları farklı mesaj türlerinde olabilir. Uygulamalar, her mesajı ilgili mesaj tipini işleyen koda yönlendirmek için sütunu message_type_name kullanabilir. İki mesaj türü sınıfı vardır:
Uygulama tarafından tanımlanan mesaj türleri, bu CREATE MESSAGE TYPE ibetle oluşturulmuştur. Bir konuşmada izin verilen uygulama tanımlı mesaj türleri kümesi, konuşma için belirlenen Hizmet Brokerı sözleşmesi tarafından tanımlanır.
Service Broker sistem mesajları ile durum veya hata bilgisi döndürür.
Bu ifade RECEIVE , kuyruk mesaj tutma belirtmedikçe alınan mesajları kuyruğun içinden kaldırır. Kuyruk için SAKLAMA ayarı AÇIKSA, ifade RECEIVEstatus sütunu günceller 0 ve mesajları kuyruk içinde bırakır. Bir RECEIVE ifade içeren işlem geri alındığında, işlemdeki kuyruk üzerindeki tüm değişiklikler de geri alınır ve mesajlar kuyruğun içine geri döner.
Bir RECEIVE ifadeyle geri dönen tüm mesajlar aynı konuşma grubuna aittir. Bu ifade RECEIVE , ifadeyi içeren işlem tamamlanana kadar geri dönen mesajlar için konuşma grubunu kilitler. Bir ifade, RECEIVE 'den bir status1mesaj döndürür. Bir RECEIVE ifadeyle döndürülen sonuç kümesi örtük olarak sıralanır:
Birden fazla konuşmadan gelen mesajlar WHERE maddesi koşullarını karşılarsa, ifade RECEIVE bir konuşmadan gelen tüm mesajları döndürür, sonra diğer herhangi bir konuşma için mesaj döndürür. Konuşmalar öncelik seviyesi sırasına göre azalan şekilde işleniyor.
Belirli bir konuşma için, bir RECEIVE ifade mesajları artan
message_sequence_numbersırayla döndürür.
Cümledeki RECEIVE WHERE cümlesi yalnızca bir arama koşulu içerebilir ve bu koşul herhangi birini conversation_handle veya conversation_group_id'i kullanabilir. Arama koşulu, kuyruktaki diğer sütunlardan birini veya birkaçını içeremez. Ya conversation_group_id da conversation_handle bir ifade olamaz. Geri dönen mesaj kümesi, WHERE maddesinde belirtilen koşullara bağlıdır:
Eğer conversation_handle belirtilirse, RECEIVE kuyruk içinde mevcut olan belirtilen konuşmadan gelen tüm mesajları döndürür.
Eğer conversation_group_id belirtilmişse, RECEIVE belirtilen konuşma grubunun herhangi bir üyesinden kuyruk içinde mevcut olan tüm mesajları döndürür.
WHERE cümlesi yoksa, RECEIVE hangi konuşma grubu olduğunu belirler:
Kuyruğunda bir veya daha fazla mesaj var.
Başka RECEIVE bir açıklama tarafından kilitlenmedi.
Bu kriterleri karşılayan tüm konuşma grupları arasında en yüksek öncelik seviyesine sahiptir.
RECEIVE Ardından, seçilen konuşma grubunun herhangi bir üyesi olan herhangi bir konuşmadan kuyruk içindeki tüm mesajları döndürür.
WHERE cümlesinde belirtilen konuşma tutucusu veya konuşma grubu tanımlayıcısı mevcut değilse veya belirtilen kuyruk ile ilişkilendirilmiyorsa, ifade RECEIVE hata döndürür.
Eğer ifadede RECEIVE belirtilen kuyruk durumu OFF olarak ayarlanmışsa, ifade Transact-SQL hatasıyla başarısız olur.
WAITFOR maddesi belirtildiğinde, ifade belirtilen zaman aşımına veya bir sonuç kümesi bulunana kadar bekler. Eğer kuyruk düşürülürse veya deyimin durumu beklenirken KAPALI olarak ayarlanırsa, ifade hemen hata döndürür. Eğer ifade RECEIVE bir konuşma grubu veya konuşma adresi belirtirse ve o konuşma hizmeti bırakılırsa veya başka bir kuyruğun içine taşınırsa, ifade RECEIVE Transact-SQL hatası bildirir.
RECEIVE kullanıcı tanımlı bir fonksiyonda geçerli değildir.
Açıklamanın RECEIVE açlıktan önlenmesi önceliği yoktur. Tek RECEIVE bir ifade bir konuşma grubunu kilitliyor ve düşük öncelikli konuşmalardan çok sayıda mesaj alıyorsa, gruptaki yüksek öncelikli konuşmalardan mesaj alınamaz. Bunu önlemek için, düşük öncelikli konuşmalardan mesaj alırken, her RECEIVE ifadenin alınan mesaj sayısını sınırlamak için TOP maddesini kullanın.
Kuyruk Sütunları
Aşağıdaki tablo kuyruktaki sütunları listeler:
| Sütun adı | Veri türü | Description |
|---|---|---|
status |
tinyint | İletinin durumu. Komutla geri dönen RECEIVE mesajlar için durum her 0zaman 'dir. Kuyruk içindeki mesajlar aşağıdaki değerlerden birini içerebilir:0=Hazır1=Alınan mesaj2=Henüz tamamlanmadı3=Gönderilen mesajı tutuldu |
priority |
tinyint | Mesaja uygulanan konuşma öncelik seviyesi. |
queuing_order |
bigint | Kuyruk içindeki mesaj sipariş numarası. |
conversation_group_id |
uniqueidentifier | Bu mesajın ait olduğu konuşma grubunun tanımlayıcısı. |
conversation_handle |
uniqueidentifier | Bu mesajın parçası olduğu konuşma için kullanıcı adı. |
message_sequence_number |
bigint | Konuşmadaki mesajın sıra numarası. |
service_name |
nvarchar(128) | Konuşmanın yapılacağı hizmetin adı. |
service_id |
int | Konuşmanın yapıldığı hizmetin SQL Server nesne tanımlayıcısı. |
service_contract_name |
nvarchar(128) | Konuşmanın takip ettiği sözleşmenin adı. |
service_contract_id |
int | Konuşmanın takip ettiği sözleşmenin SQL Server nesne tanımlayıcısı. |
message_type_name |
nvarchar(128) | Mesajın formatını tanımlayan mesaj türünün adı. Mesajlar uygulama mesajı tipleri veya Broker sistem mesajları olabilir. |
message_type_id |
int | Mesajı tanımlayan mesaj tipine ait SQL Server nesne tanımlayıcısı. |
validation |
nchar(2) | Mesaj için kullanılan doğrulama.E=BoşN=YokX=XML |
message_body |
varbinary(MAX) | İletinin içeriği. |
Permissions
Bir mesaj almak için mevcut kullanıcının kuyruk üzerinde iznine sahip RECEIVE olması gerekir.
Examples
A. Bir konuşma grubundaki tüm mesajlar için tüm sütunları alın
Aşağıdaki örnek, sıradaki mevcut konuşma grubu ExpenseQueue için kuyruktan tüm mevcut mesajları alır. Bu ifade mesajları sonuç kümesi olarak döndürür.
RECEIVE * FROM ExpenseQueue ;
B. Bir konuşma grubundaki tüm mesajlar için belirlenen sütunları alın
Aşağıdaki örnek, sıradaki mevcut konuşma grubu ExpenseQueue için kuyruktan tüm mevcut mesajları alır. Bu ifade, mesajları sütunları içeren bir sonuç kümesi conversation_handleolarak döndürür message_type_name, , ve message_body.
RECEIVE conversation_handle, message_type_name, message_body
FROM ExpenseQueue ;
C. Kuyruğun ilk mevcut mesajını alın
Aşağıdaki örnek, kuyruktan ilk mevcut mesajı ExpenseQueue bir sonuç kümesi olarak alır.
RECEIVE TOP (1) * FROM ExpenseQueue ;
D. Belirli bir konuşma için tüm mesajları alın
Aşağıdaki örnek, belirlenen konuşma ExpenseQueue için kuyruk için mevcut tüm mesajları bir sonuç kümesi olarak alır.
DECLARE @conversation_handle UNIQUEIDENTIFIER ;
SET @conversation_handle = <retrieve conversation from database> ;
RECEIVE *
FROM ExpenseQueue
WHERE conversation_handle = @conversation_handle ;
E. Belirli bir konuşma grubu için mesaj alın
Aşağıdaki örnek, belirlenen konuşma grubu ExpenseQueue için kuyruk için mevcut tüm mesajları bir sonuç kümesi olarak alır.
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. Bir tablo değişkenine alın
Aşağıdaki örnek, belirli bir konuşma grubu için mevcut tüm mesajları kuyraktan ExpenseQueue bir tablo değişkenine alır.
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. Mesaj almak ve süresiz beklemek
Aşağıdaki örnek, kuyruktaki ExpenseQueue bir sonraki mevcut konuşma grubu için tüm mevcut mesajları alır. Bu ifade en az bir mesaj kullanılabilir olana kadar bekler, ardından tüm mesaj sütunlarını içeren bir sonuç kümesi döndürür.
WAITFOR (
RECEIVE *
FROM ExpenseQueue) ;
H. Mesaj alın ve belirli bir aralık için beklen.
Aşağıdaki örnek, kuyruktaki ExpenseQueue bir sonraki mevcut konuşma grubu için tüm mevcut mesajları alır. Bu ifade 60 saniye veya en az bir mesaj kullanılabilir olana kadar bekler; hangisi önce gelirse. Bu ifade, en az bir mesaj mevcutsa tüm mesaj sütunlarını içeren bir sonuç kümesi döndürür. Aksi takdirde, ifade boş bir sonuç kümesi döndürür.
WAITFOR (
RECEIVE *
FROM ExpenseQueue ),
TIMEOUT 60000 ;
I. Mesaj alın, sütunun türünü değiştirin
Aşağıdaki örnek, kuyruktaki ExpenseQueue bir sonraki mevcut konuşma grubu için tüm mevcut mesajları alır. Mesaj türü mesajın bir XML belgesi içerdiğini belirttiğinde, ifade mesaj gövdesini XML'e 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 ;
J. Mesaj alın, mesaj gövdesinden veri çıkarılır, konuşma durumunu alın
Aşağıdaki örnek, kuyruğun bir sonraki mevcut konuşma grubu ExpenseQueue için bir sonraki mevcut mesajı alır. Mesaj türünde //Adventure-Works.com/Expenses/SubmitExpense, ifade çalışan kimliğini ve mesaj gövdesinden bir madde listesini çıkarır. Bu ifade ayrıca masadan konuşma ConversationState için durumu da alır.
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 = "https://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 = "https://Adventure-Works.com/schemas/expenseReport"
/rpt:ExpenseReport/rpt:ItemDetail')
ELSE NULL
END AS ItemList
FROM ExpenseQueue
), TIMEOUT 60000 ;