Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Julia2

[Resolvido] Trigger falhando num update em lote, que faço?

Recommended Posts

Olá,

 

Tenho uma job que faz update em diversas linhas numa tabela, ocorre que uma trigger desta tabela acaba falhando. Ocorre o seguinte erro:

 

Server: Msg 512, Level 16, State 1, Procedure InclusaoEdicaoVendas, Line 9

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, mas acho que é devido ao update afetar muitas linhas. Abaixo o ponto em que ocorre o erro:

 

create trigger InclusaoEdicaoVendas

on entvendas for insert, update

as

 

declare @cdemp as int,

@seq as int

set @cdemp = (select cd_empresa_soc from inserted) -- Aqui ocorre o erro

set @seq = (select nr_sequencia_soc from inserted)

 

 

Não é possível trigger para processos em lote?

 

 

Grata,

Julia

Compartilhar este post


Link para o post
Compartilhar em outros sites

possivel é, mas tem que usar mais de um filtro.... o seu sub esta armazenando mais de um valor e isso ele nao aceita!

qual o resto da triger ou é somente isso? ela somente "seta" variaveis?

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Subquery returned more than 1 value.

 

declare @cdemp as int,
@seq as int
set @cdemp = (select cd_empresa_soc from inserted) -- Aqui ocorre o erro
set @seq = (select nr_sequencia_soc from inserted)

 

Na atribuição o select retorna mais de um valor, logo não dá para atribuir só a uma variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapazes, agradecida

 

Não posso postar o restante da trigger, ela está pegando as variáveis para fazer uma pesquisa e depois grava os dados numa table.

 

Só para esclarecer, a tabela inserted vai ter diversas linhas é por isso?

 

Para mim, ela só teria uma única linha em cada edição.

 

 

Grata

Julia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julia,

 

É como o motta passou, vai precisar usar cursor para pegar os dados da tabela inserted e depois jogar na sua tabela de destino.

 

como você nao quer postar a estrutura completa, o que nao faz sentido porque nao tem como descobrirmos a sua empresa so pela estrutura, então aqui segue uma solução bem genérica da sua idéia:

 

declare  @cdemp as int
declare @seq as int
DECLARE db_cursor CURSOR FOR  
SELECT cd_empresa_soc, nr_sequencia_soc
FROM inserted;

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @cdemp, @seq   

WHILE @@FETCH_STATUS = 0   
BEGIN   
  	if(exists(select * from tabelaimaginaria1 where cdemp = @cdemp or seq = @seq))
  	begin
       	insert into tabelaImaginaria2 values (@cdemp, @seq);
  	end;

  	FETCH NEXT FROM db_cursor INTO @cdemp, @seq   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor 

 

A idéia que tentei passar no código é que usando o cursor, o que estiver dentro do while, você estará usando como se as variaveis @cdemp e @seq fossem vetores e poderá estar usando da forma que desejar.

 

Essa á sua solução, assim já explanada pelo Motta. Para colocarmos funcionando para você, aí é necessário que passe o nome das tabelas, campos e o que deseja fazer.

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço novamente, rapazes.

 

Fabio, eu não posso revelar em que tipo de negócio eu trabalho, o que tornaria possível através da exposição da trigger...

 

Nunca utilizamos cursores, é um processo caro ao banco; vou utilizar While com sql puro, sempre fazemos assim. Já confirmei o que eu imaginava; que no caso de processos em lote, a inserted/deleted têm mais de uma linha.

 

..este tópico está encerrado.

 

Grata,

Julia

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.