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?
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. –
To było dokładnie to, czego potrzebowałem, aby rozwiązać napotkany problem. Chciałbym móc odpowiedzieć na to pytanie +10. – Brandon