2013-07-23 4 views
6

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セットを使用することができます

答えて

9

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

ここ用語は、私がしようとしなかった一つのことだったdelete...outputinsert...output

+0

おかげで、一致したもののupdatedeletedinsertedセットも、以前のようにして後に考えることができます!私は彼らが本当にここでキーワードの選択を改善できたと思う。変更されていない値について 'deleted'セットを調べるのは論理的ではないようです。 –

+2

これはまさに私が遭遇した問題を解決するために必要なものでした。私はこの回答を+10回することができたらいいと思う。 – Brandon