um tempo atrás eu fiz uma pergunta sobre como tornar o diálogo de início e envio mais flexível para que ele possa ser incorporado em um procedimento que leva os parâmetros to, from, como variáveis sysname.
no entanto, como Rusanu mencionou na resposta, essa mesma técnica não pode ser usada para a cláusula From do Receive.
Na verdade vai funcionar. A maioria dos verbos SSB aceita parâmetros para seus argumentos (exceto o nome da fila para RECEIVE, é claro). Os parâmetros são do tipo sysname ...
na verdade o lado de envio está feito e agora estou tentando flexibilizar o RECEIVE da mesma forma, algo como:
CREATE PROCEDURE QueueReceive
@myTargetQueue SYSNAME
@cg UNIQUEIDENTIFIER OUTPUT
@ch UNIQUEIDENTIFIER OUTPUT
@msg XML OUTPUT
as
BEGIN TRANSACTION;
WAITFOR
( RECEIVE TOP(1)
@cg = conversation_group_id,
@msg = cast(message_body as XML),
@ch= conversation_handle
FROM @myTargetQueue
), TIMEOUT 3000;
COMMIT
...
Parece que variáveis do tipo sysname não podem ser usadas na cláusula from do RECEIVE? Se eu tivesse que fazer isso em SQL dinâmico, como retornaria todas as variáveis, conversation_group_id, conversation_handle, etc. da execução do sql dinâmico de uma função de recebimento? existe uma técnica de melhor desempenho para realizar a mesma coisa?
Obrigada.
CORREÇÃO/Atualização ATÉ AGORA: Estou criando um monte de cláusulas IF dependendo de qual é o parâmetro passado, ele apenas executará uma instrução de recebimento inteira diferente. Não é eficiente porque tenho que alterar o código do procedimento sempre que adiciono uma nova QUEUE, mas acho que serve por enquanto ...
Como RECEIVE é basicamente um DELETE e, como tal, possui um plano de consulta, ele deve obedecer às mesmas restrições que as instruções SELECT/INSERT/DELETE/UPDATE têm, especificamente as restrições de que o objeto sobre o qual ele atua deve ser conhecido em tempo de compilação , não em tempo de execução .
A única opção é usar SQL dinâmico, com todas as vantagens e desvantagens que se seguem .
Você também pode gerar o corpo do procedimento durante a implantação do projeto, ter um único modelo e gerar um procedimento específico para cada fila, especializado para o nome da fila específica. Se isso é viável depende de muitos fatores, principalmente da organização do seu projeto e de como você implanta.
Por outro lado, estou surpreso em saber que você tem muitas filas. Em geral a tendência é ter uma única fila e vários leitores de fila ( ativadosprocedimentos). Como a programação SSB é orientada a eventos (aguardar mensagem, processar mensagem, aguardar mensagem, processar mensagem, aguardar mensagem...), ter mais de uma fila para aguardar mensagens torna-se mais difícil, pois o aplicativo agora precisa esperar em várias fontes (por exemplo, um encadeamento por fila, pelo menos). Mesmo com a ativação SSB, que alivia a necessidade de espera explícita, pois inicia o código para processar a mensagem sob demanda, várias filas são mais difíceis de gerenciar (max_queue_readers por fila adiciona talvez muitos procedimentos internos ativados iniciados). Considere o uso de um único serviço e fila no lado RECEIVE. Mesmo quando vários serviços são necessários (por qualquer motivo), eles podem ser consolidados em uma única fila.
Este é um procedimento de recebimento de amostra funcional que é reutilizável em diferentes filas.