with variable uso update into inserted ejemplo tsql sql-server-2008-r2 common-table-expression

tsql - variable - Es posible ACTUALIZAR y SELECCIONAR en instrucción única usando la cláusula OUTPUT con CTE que contiene JOIN?



uso de output sql server (1)

Puede usar el conjunto deleted en la cláusula de salida para hacer referencia a columnas en su CTE en tablas que no se actualizan

p.ej

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

Los conjuntos deleted e inserted en una update también podrían considerarse como antes y después, aunque la terminología aquí coincide con delete...output e insert...output

Tenemos una serie de procedimientos almacenados que BizTalk utiliza para buscar n filas de una cola (y una tabla unida) y actualizar el estado de esos elementos al mismo tiempo.

Estoy tratando de modificar estas consultas para eliminar el uso de variables de tabla y en su lugar hacer el trabajo en una sola declaración. He tenido éxito con algunos, pero este ejemplo particular es complicado porque hay una join en el CTE, y quiero devolver algunas de las columnas unidas aunque no formen parte de la update .

Esto es lo que se me ocurrió:

;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

Esto falla inmediatamente con el siguiente error:

La referencia de columna "insert.Message" no está permitida porque hace referencia a una tabla base que no se está modificando en esta instrucción.

Claramente, esto se debe a que las columnas Message e Interaction no pueden devolverse como parte del conjunto inserted , porque están en una tabla diferente y, por lo tanto, no se actualizaron.

Así que intenté cambiar la cláusula de output a:

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

Esto falla con el error:

El identificador de varias partes "q.Message" no se pudo enlazar.

¿Es posible lograr esto sin reescribir la consulta para usar tablas temporales o variables de tabla?