2013-07-23 11 views
6

BizTalk tarafından bir sıradan (ve birleştirilmiş tabloya) n satırları almak ve aynı zamanda bu öğelerin durumunu aynı anda güncelleştirmek için kullanılan bir dizi saklı yordamımız var.JOIN ile CTE içeren OUTPUT yan tümcesi kullanılarak tek bir deyimde GÜNCELLEŞTİRME ve SEÇIM kullanılabilir mi?

Tablo değişkenlerinin kullanımını kaldırmak için bu sorguları değiştirmeye çalışıyorum ve bunun yerine çalışmayı tek bir deyimle yapın. Bazıları ile başarılı oldum, ancak bu özel örnek, CTE'de bir join olduğundan ve update'un bir parçası olmamasına rağmen birleştirilmiş sütunlardan bazılarını döndürmek istediğim için çok zor.

;with q as 
(
    select top (@FetchCount) 
     iq.InQueueId, 
     itk.[Message], 
     iq.PatNo, 
     iq.DistrictNo, 
     itk.Interaction, 
     iq.[Status] 
    from 
     InQueue iq 
     join Itk on iq.InQueueId = itk.InQueueId 
     join [Endpoint] e on iq.[Endpoint] = e.EndpointId 
     join EndpointName en on en.EndpointNameId = e.Name 
    where 
     en.Name = 'XYZ' 
     and iq.[Status] = @StatusNew 
    order by 
     iq.InQueueId 
) 
update 
    q 
set 
    [Status] = @StatusSelected 
output 
    inserted.InQueueId as [Id], 
    inserted.[Message] as [Msg], 
    inserted.DistrictNo, 
    inserted.Interaction 

Bu hemen aşağıdaki hata nedeniyle başarısız: sütunlar İleti ve Etkileşim olamaz çünkü

The column reference "inserted.Message" is not allowed because it refers to a base table that is not being modified in this statement.

Açıkçası bu ben gelmek ne

Bu

olduğunu inserted kümesinin bir parçası olarak döndürülmüştür, çünkü bunlar farklı bir tablodadır ve bu nedenle güncelleştirilmemiştir.

output 
    inserted.InQueueId as [Id], 
    q.[Message] as [Msg], 
    inserted.DistrictNo, 
    q.Interaction 

Bu hata ile başarısız:

The multi-part identifier "q.Message" could not be bound.

geçici tablolar veya edinme sorguyu yeniden yazmadan bunu başarmak mümkün mü

yüzden hiç output maddesinin değiştirilmesine teşebbüs Tablo değişkenleri?

cevap

9

Sen

güncellenmeyen tablolarda sizin CTE sütunları başvurmak için çıkış maddesi içinde deleted setini kullanabilirsiniz mesela Bir update yılında

output 
    inserted.InQueueId as [Id], 
    deleted.[Message] as [Msg], 
    inserted.DistrictNo, 
    deleted.Interaction 

deleted ve inserted setleri da daha önce olduğu gibi düşünülebilir ve terminoloji burada delete...output ve insert...output

+0

Teşekkür maçları rağmen sonra, ben deneyin vermedi tek şeydi! Burada anahtar kelime seçimini gerçekten geliştirmiş olabilirler. değişmemiş olan değerler için "silindi" kümesine bakmak mantıklı görünmüyor. –

+2

Karşılaştığım bir sorunu çözmek için ihtiyacım olan şey buydu. Keşke bu cevabı + 10'luk edebilseydim. – Brandon