AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 19152
Accepted
fa1c0n3r
fa1c0n3r
Asked: 2012-06-13 16:34:22 +0800 CST2012-06-13 16:34:22 +0800 CST 2012-06-13 16:34:22 +0800 CST

Como fazer um agente de serviço flexível receber em um procedimento sql armazenado, como passar o parâmetro "FROM" para receber

  • 772

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.

Service Broker Procedimento que será usado por vários iniciadores para iniciar a conversa de diálogo.. como passar um parâmetro para ele

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 ...

sql-server sql-server-2008
  • 2 2 respostas
  • 6515 Views

2 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2012-06-13T21:02:36+08:002012-06-13T21:02:36+08:00

    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.

    • 5
  2. Andre Booysen
    2013-04-02T04:17:25+08:002013-04-02T04:17:25+08:00

    Este é um procedimento de recebimento de amostra funcional que é reutilizável em diferentes filas.

    ALTER PROCEDURE [dbo].[zBroker_OnReceive_WFItemsUpdated_Queue]
    AS
    BEGIN
                    SET NOCOUNT ON;
    
                    DECLARE @h UNIQUEIDENTIFIER;
                    DECLARE @messageType int;
                    DECLARE @Packet VARCHAR(50);
                    DECLARE @MyId UNIQUEIDENTIFIER;
                    DECLARE @QueueName NVARCHAR(200);
                    DECLARE @Sql NVARCHAR(2000);
    
                    SET  @MyId = NEWID(); -- Just an Id for testing that get's written to the log table
    
                    SET @QueueName = (
                                    SELECT q.NAME
                                    FROM                                
                                                    sys.service_queues q (nolock)
                                    JOIN                
                                                    sys.dm_broker_activated_tasks t (nolock) ON t.spid = @@SPID AND q.object_id = t.queue_id
                    )   
                    SET @Sql = 'WAITFOR( RECEIVE TOP(1) 
                                                    @h = conversation_handle,
                                                    @messageType = message_type_id,
                                                    @Packet = message_body
                                                    FROM ' + @QueueName + '), TIMEOUT 1000;'
    
                    --Clear the queue
                    WHILE (1=1)
                 BEGIN
                                    BEGIN TRANSACTION;
    
                                 EXECUTE sp_executesql @Sql
                                    ,N'@h UNIQUEIDENTIFIER OUTPUT,@messageType int OUTPUT,@Packet VARCHAR(50) OUTPUT'
                                    ,@h = @h OUTPUT
                                    ,@messageType = @messageType OUTPUT
                                    ,@Packet = @Packet OUTPUT
    
    
                                    IF (@@ROWCOUNT = 0)
                                    BEGIN
                                                    COMMIT;
                                                  BREAK;
                                    END
                                    ELSE
                                    BEGIN
    
                                                    IF  @messageType <= 2  
                                                    BEGIN
                                                                    END CONVERSATION @h;
                                                    END
                                                ELSE 
                                                    BEGIN
    
                                                                    INSERT  INTO t_log (logdata,msgdata,ProcId,StartTime)
                                                                    VALUES  ( @QueueName, @Packet ,@MyId,GETDATE());
    
                                                                    WAITFOR DELAY '00:00:10';
                                                                    UPDATE t_log SET EndTime = GETDATE()
                                                                    WHERE logid = @@identity
    
                                                                    END CONVERSATION @h;
                                                END                             
    
                                                COMMIT;
                                    END
                END
    END
    
    • 3

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve