BizTalkがキュー(および結合されたテーブル)からn行をフェッチし、それらのアイテムのステータスを同時に更新するために、BizTalkによって使用される多数のストアドプロシージャがあります。JOINを含むCTEでOUTPUT句を使用して、単一ステートメントでUPDATEとSELECTを行うことは可能ですか?
これらのクエリを変更して、テーブル変数の使用を削除し、その代わりに1つのステートメントで作業を実行しようとしています。私はいくつかで成功しましたが、この特定の例は、CTEにjoin
があり、それらがupdate
の一部ではないにもかかわらず、結合された列のいくつかを返したいので、扱いにくいです。
これは私が出ているものです:
;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
これは、すぐに次のエラーで失敗します。列メッセージと相互作用ができないため、
The column reference "inserted.Message" is not allowed because it refers to a base table that is not being modified in this statement.
は、これは明らかにされinserted
セットの一部として戻されました。それらは異なるテーブルにあり、更新されなかったためです。
だから私はにoutput
句を変更しようとしました:これはエラーで失敗し
output
inserted.InQueueId as [Id],
q.[Message] as [Msg],
inserted.DistrictNo,
q.Interaction
:
The multi-part identifier "q.Message" could not be bound.
は、それは一時テーブルのいずれかを使用するクエリを書き換えることなく、これを達成することは可能ですかテーブル変数?
あなたは、例えばを更新されないテーブルにあなたのCTEの列を参照するために、出力句でdeleted
セットを使用することができます
おかげで、一致したものの
update
でdeleted
とinserted
セットも、以前のようにして後に考えることができます!私は彼らが本当にここでキーワードの選択を改善できたと思う。変更されていない値について 'deleted'セットを調べるのは論理的ではないようです。 –これはまさに私が遭遇した問題を解決するために必要なものでした。私はこの回答を+10回することができたらいいと思う。 – Brandon