2013-07-23 15 views
6

Mamy wiele procedur przechowywanych, które są używane przez BizTalk do pobierania n wierszy z kolejki (i połączonej tabeli) i aktualizują status tych elementów w tym samym czasie.Możliwe jest UPDATE i SELECT w pojedynczej instrukcja za pomocą klauzuli OUTPUT z CTE zawierające JOIN?

Próbuję zmodyfikować te zapytania, aby usunąć użycie zmiennych tabeli i zamiast tego wykonać pracę w pojedynczej instrukcji. Udało mi się z niektórymi, ale ten konkretny przykład jest trudny, ponieważ w CTE istnieje join i chcę zwrócić niektóre z łączonych kolumn, mimo że nie były częścią update.

To co mam wymyślić:

;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 

Ten natychmiast zawodzi z powodu następującego błędu:

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

Wyraźnie to dlatego, że kolumny wiadomości i Interakcje nie może być zwrócone jako część zestawu inserted, ponieważ znajdują się w innej tabeli i dlatego nie zostały zaktualizowane.

Więc próbowałem zmienić klauzulę output:

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

to się nie powiedzie się z powodu błędu:

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

jest to możliwe do osiągnięcia tego celu bez przepisywania zapytania użyć zarówno tabel tymczasowych lub zmienne tabel?

Odpowiedz

9

Można użyć zestawu deleted w punkcie wyjściowym do referencyjnych kolumn w CTE w tabelach, które nie zostały zaktualizowane

np

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

The deleted i inserted zestawów w update może być również traktowane jako przed i po, chociaż terminologia tutaj pasuje delete...output i insert...output

+0

Dzięki, że była jedna rzecz ja nie spróbować! Myślę, że naprawdę mogliby poprawić tutaj wybór słów kluczowych; nie wydaje się logiczne szukanie w zestawie "usuniętych" dla wartości, które się nie zmieniły. –

+2

To było dokładnie to, czego potrzebowałem, aby rozwiązać napotkany problem. Chciałbym móc odpowiedzieć na to pytanie +10. – Brandon

Powiązane problemy