2013-07-23 49 views
6

Chúng tôi có một số quy trình được lưu trữ được BizTalk sử dụng để tìm nạp n hàng từ hàng đợi (và bảng đã tham gia) và cập nhật trạng thái của các mục đó cùng một lúc.Có thể UPDATE và SELECT trong câu lệnh đơn sử dụng mệnh đề OUTPUT với CTE chứa JOIN?

Tôi đang cố gắng sửa đổi các truy vấn này để loại bỏ việc sử dụng các biến bảng và thay vào đó thực hiện công việc trong một câu lệnh. Tôi đã thành công với một số, nhưng ví dụ cụ thể này là khó khăn bởi vì có một join trong CTE, và tôi muốn trả lại một số cột đã tham gia mặc dù chúng không phải là một phần của update.

Đây là những gì tôi đã đưa ra:

;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 

này ngay lập tức không thành công với các lỗi sau:

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

Rõ ràng điều này là vì các cột nhắnInteraction không thể được trả về như một phần của tập hợp inserted, vì chúng nằm trong một bảng khác và do đó không được cập nhật.

Vì vậy, tôi đã cố gắng để thay đổi output khoản để:

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

này không thành công với các lỗi:

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

Có thể đạt được điều này mà không cần viết lại các truy vấn để sử dụng một trong hai bảng tạm thời hoặc biến bảng?

Trả lời

9

Bạn có thể sử dụng các thiết lập deleted trong mệnh đề đầu ra để tham khảo cột trong CTE của bạn trong bảng mà không được cập nhật

ví dụ

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

Các deletedinserted bộ trong một update cũng có thể được dùng như trước và sau đó, mặc dù các thuật ngữ ở đây phù hợp với delete...outputinsert...output

+0

Cảm ơn, đó là một điều tôi không thử! Tôi nghĩ rằng họ thực sự có thể cải thiện lựa chọn từ khóa ở đây; nó không có vẻ hợp lý khi nhìn vào tập 'xóa' cho các giá trị không thay đổi. –

+2

Đây chính xác là những gì tôi cần để giải quyết một vấn đề mà tôi gặp phải. Tôi ước tôi có thể +10 câu trả lời này. – Brandon

Các vấn đề liên quan