Usuário com melhor resposta
Stored Procedure com retorno de mais de um item

Pergunta
-
Pessoal! Boa noite!
Estou com um problema e gostaria de ver se alguém tem alguma ideia de solução:
Tenho uma tabela onde incluo algumas demandas de técnicos disponíveis, e outra onde tenho os técnicos que estão disponíveis (ou não) e que atendem os requisitos da solicitação, por exemplo:
Tabela 01 (solicitações):
Solicitação 01 - Técnico fluente em inglês que esteja disponível depois das 18h00 dia 05/10/2018.
Tabela 02 (técnicos):
Paulo - fala inglês - disponível 06/10/2018 08:00;
José - fala espanhol - disponível 06/10/2018 18:00;
Robson - fala inglês - disponível 05/10/2018 18:00;
João - fala francês - disponível 05/10/2018 18:00;
André - fala inglês - disponível 05/10/2018 18:00.
Seguindo esta lógica, preciso criar uma Tabela 03 com os técnicos que "cumprem os requisitos", tipo:
Solicitação 01 - Robson;
Solicitação 01 - André.
Tento fazer mas dá este erro:
Msg 512, Nível 16, Estado 1, Procedimento dbo.Solicitacao_Busca, Linha 17 [Linha de Início do Lote 0]
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.Alguém tem alguma ideia para me ajudar por favor?
Agradeço antecipadamente.
Robson Parisoto.
Robson Giovanni Parisoto.
Respostas
-
Deleted
- Marcado como Resposta Robson Giovanni Parisoto sábado, 29 de setembro de 2018 21:09
Todas as Respostas
-
-
Bom dia José! Obrigado pelo retorno!
Tenho três tabelas:
Uma que é o cadastro de técnicos, tem nome, idioma, hora disponível;
Outra que é das solicitações (que um cliente faz), que tem, cliente, idioma solicitado e hora que quer o serviço;
Preciso de uma terceira tabela que me diga quais técnicos da tabela 01 estão de acordo com a solicitação do cliente na tabela 02. Então, criei uma procedure que inicia sempre que uma nova linha é incluída na tabela 02 (faz um match entre solicitação e disponibilização).
Deu erro para mim pois as vezes tenho dois técnicos que se enquadram no perfil solicitado, e preciso criar duas colunas, aí ele dá o erro abaixo:
Msg 512, Nível 16, Estado 1, Procedimento dbo.Solicitacao_Busca, Linha 17 [Linha de Início do Lote 0]
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.Não sei se consegui explicar melhor, qualquer coisa me avise.
Obrigado.
Robson Giovanni Parisoto.
-
-
-
Muito bom José! Vou fazer alguns testes pra ver se consigo utilizar.
Quanto ao processo de seleção, normalmente o técnico responde por um idioma somente, e a hora, é sempre de seis em seis, então, tenho fixo quem estará disponível, as 6, 12, 18, 24 e 6 novamente.
O esquema funcionará tipo um Uber, onde o cliente faz a solicitação, a procedure cria essa tabela para que o cliente possa ver quem está disponível, o ETL envia notificação para os técnicos disponíveis, e o primeiro que selecionar, fará o atendimento.
Por isso é bem simples, o ruim é que realmente não consigo relacionar quantos notificaram em seu usuário que terminaram uma atividade e estarão prontos para o próximo horário, que ele mesmo define que será as 6, 12, 18 ou 24.
Mas vou tentar e te aviso, por hora te agradeço imensamente, vou tentar fazer e te aviso depois.
Obrigado.
Robson Giovanni Parisoto.
-
José! Fiz da seguinte forma:
ALTER PROCEDURE [dbo].[MatchTecnico]
@IDIOMA VARCHAR(150),
@DATAHORASOLICITACAO DATETIME
WITH CONSULTA AS ( SELECT NOMETECNICO, SEQ = ROW_NUMBER() OVER (ORDER BY NOMETECNICO)
FROM TECNICOS
WHERE IDIOMA = @IDIOMA
AND DATADISPONIVEL = @DATAHORASOLICITACAO )
INSERT INTO MATCHTECNICO
(TECNICO, DATACADASTRO)
VALUES
(MAX (CASE WHEN SEQ = 1 THEN TECNICO END),
GETDATE() )
Aí deu este erro:
Msg 207, Nível 16, Estado 1, Procedimento MatchTecnico, Linha 26 [Linha de Início do Lote 5] Invalid column name 'SEQ'.
Msg 4104, Nível 16, Estado 1, Procedimento MatchTecnico, Linha 26 [Linha de Início do Lote 5] The multi-part identifier "TECNICO" could not be bound.
Me desculpe se estou fazendo erros amadores demais, pois na verdade não tenho a expertise nisso mesmo, kkk.
Robson Giovanni Parisoto.
- Editado Robson Giovanni Parisoto sábado, 29 de setembro de 2018 16:45
-
Deleted
- Marcado como Resposta Robson Giovanni Parisoto sábado, 29 de setembro de 2018 21:09
-