When I update a single row, it works fine. But when I update all rows with:
UPDATE cad_bilhetes
SET ligacao_acobrar = 'False'
I get the following error:
Msg 512, Level 16, State 1, Procedure TG_CAD_BILHETES_UPDATE, Line 34 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.
In line 34 of TG_CAD_BILHETES_UPDATE there is:
DECLARE @VALOR_LIGACOES_DDI_ATUAL DECIMAL(7,2)
The beginning of the trigger:
ALTER TRIGGER [dbo].[TG_CAD_BILHETES_UPDATE]
ON [dbo].[CAD_BILHETES]
INSTEAD OF UPDATE
AS
BEGIN
DECLARE @ID INT
DECLARE @VALOR_BILHETE_NOVO DECIMAL(7,2)
DECLARE @VALOR_BILHETE_ATUAL DECIMAL(7,2)
DECLARE @ENCONTROU INT
DECLARE @ID_CONTRATACAO INT
DECLARE @TIPO VARCHAR(2)
DECLARE @TIPO_APARELHO VARCHAR(1)
DECLARE @ID_COMPETENCIA INT
DECLARE @ID_CONTRATACAO_ATUAL INT
DECLARE @ID_CONTRATACAO_NOVO INT
DECLARE @VALOR_LIGACOES_DDD_FIXO_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_DDD_MOVEL_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_LOCAL_MOVEL_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_LOCAL_FIXO_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_DDI_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_VOIP_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_TOM_REMOTO_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_DDD_FIXO_ATUAL DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_DDD_MOVEL_ATUAL DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_LOCAL_MOVEL_ATUAL DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_LOCAL_FIXO_ATUAL DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_DDI_ATUAL DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_VOIP_ATUAL DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_TOM_REMOTO_ATUAL DECIMAL(7,2)
DECLARE @VALOR_OS_NOVO DECIMAL(7,2)
DECLARE @FOI_CANCELADO_NOVO BIT
SET @ENCONTROU = 0
SET @ID = (SELECT ID FROM INSERTED)
SET @ID_COMPETENCIA = (SELECT ID_COMPETENCIA FROM INSERTED)
SET @VALOR_LIGACOES_DDD_FIXO_NOVO = 0
SET @VALOR_LIGACOES_DDD_MOVEL_NOVO = 0
SET @VALOR_LIGACOES_LOCAL_MOVEL_NOVO = 0
SET @VALOR_LIGACOES_LOCAL_FIXO_NOVO = 0
SET @VALOR_LIGACOES_DDI_NOVO = 0
SET @VALOR_LIGACOES_VOIP_NOVO = 0
SET @VALOR_LIGACOES_TOM_REMOTO_NOVO = 0
SET @VALOR_LIGACOES_DDD_FIXO_ATUAL = 0
SET @VALOR_LIGACOES_DDD_MOVEL_ATUAL = 0
SET @VALOR_LIGACOES_LOCAL_MOVEL_ATUAL = 0
SET @VALOR_LIGACOES_LOCAL_FIXO_ATUAL = 0
SET @VALOR_LIGACOES_DDI_ATUAL = 0
SET @VALOR_LIGACOES_VOIP_ATUAL = 0
SET @VALOR_LIGACOES_TOM_REMOTO_ATUAL = 0
SELECT TOP (1)
@TIPO = SUBSTRING(B.TIPO, 2, 2), @TIPO_APARELHO = SUBSTRING(B.TIPO, 4, 1),
@VALOR_BILHETE_ATUAL = B.VALOR,
@ID_CONTRATACAO_ATUAL = C.ID
FROM CAD_BILHETES AS B
JOIN CAD_CONTRATACAO AS C
ON B.ID_PRODUTO = C.ID_PRODUTO AND (B.DATA_HORA >= C.DATA_INICIO AND (C.DATA_FIM IS NULL OR B.DATA_HORA <= C.DATA_FIM))
WHERE B.ID = @ID and
C.FOI_CANCELADA= 'FALSE'
IF @ID_CONTRATACAO_ATUAL IS NOT NULL
BEGIN
IF(@TIPO = 'IV')
BEGIN
SET @VALOR_LIGACOES_VOIP_ATUAL = @VALOR_BILHETE_ATUAL
END
ELSE
IF(@TIPO = 'IT')
BEGIN
SET @VALOR_LIGACOES_TOM_REMOTO_ATUAL = @VALOR_BILHETE_ATUAL
END
ELSE
IF(@TIPO = 'EL')
BEGIN
IF(@TIPO_APARELHO = 'F')
BEGIN
SET @VALOR_LIGACOES_LOCAL_FIXO_ATUAL = @VALOR_BILHETE_ATUAL
END
ELSE
IF(@TIPO_APARELHO = 'M')
BEGIN
SET @VALOR_LIGACOES_LOCAL_MOVEL_ATUAL = @VALOR_BILHETE_ATUAL
END
END
ELSE
IF(@TIPO = 'EN')
BEGIN
IF(@TIPO_APARELHO = 'F')
BEGIN
SET @VALOR_LIGACOES_DDD_FIXO_ATUAL = @VALOR_BILHETE_ATUAL
END
ELSE
IF(@TIPO_APARELHO = 'M')
BEGIN
SET @VALOR_LIGACOES_DDD_MOVEL_ATUAL = @VALOR_BILHETE_ATUAL
END
END
ELSE
IF(@TIPO = 'EI')
BEGIN
SET @VALOR_LIGACOES_DDI_ATUAL = @VALOR_BILHETE_ATUAL
END
END
SELECT @TIPO = SUBSTRING(I.TIPO, 2, 2), @TIPO_APARELHO = SUBSTRING(I.TIPO, 4, 1),
@VALOR_BILHETE_NOVO = I.VALOR,
@ID_CONTRATACAO_NOVO = C.ID,
@FOI_CANCELADO_NOVO = I.FOI_CANCELADO,
@ID_COMPETENCIA = I.ID_COMPETENCIA
FROM INSERTED AS I
JOIN CAD_CONTRATACAO AS C
ON I.ID_PRODUTO = C.ID_PRODUTO AND (I.DATA_HORA >= C.DATA_INICIO AND (I.DATA_HORA <= C.DATA_FIM OR C.DATA_FIM IS NULL))
WHERE C.FOI_CANCELADA= 'FALSE'
IF @ID_CONTRATACAO_NOVO IS NOT NULL
BEGIN
IF(@TIPO = 'IV')
BEGIN
SET @VALOR_LIGACOES_VOIP_NOVO = @VALOR_BILHETE_NOVO
END
ELSE
IF(@TIPO = 'IT')
BEGIN
SET @VALOR_LIGACOES_TOM_REMOTO_NOVO = @VALOR_BILHETE_NOVO
END
ELSE
IF(@TIPO = 'EL')
BEGIN
IF(@TIPO_APARELHO = 'F')
BEGIN
SET @VALOR_LIGACOES_LOCAL_FIXO_NOVO = @VALOR_BILHETE_NOVO
END
ELSE
IF(@TIPO_APARELHO = 'M')
BEGIN
SET @VALOR_LIGACOES_LOCAL_MOVEL_NOVO = @VALOR_BILHETE_NOVO
END
END
ELSE
IF(@TIPO = 'EN')
BEGIN
IF(@TIPO_APARELHO = 'F')
BEGIN
SET @VALOR_LIGACOES_DDD_FIXO_NOVO = @VALOR_BILHETE_NOVO
END
ELSE
IF(@TIPO_APARELHO = 'M')
BEGIN
SET @VALOR_LIGACOES_DDD_MOVEL_NOVO = @VALOR_BILHETE_NOVO
END
END
ELSE
IF(@TIPO = 'EI')
BEGIN
SET @VALOR_LIGACOES_DDI_NOVO = @VALOR_BILHETE_NOVO
END
SELECT @ENCONTROU = 1
FROM CAD_CUSTO_PRODUTO
WHERE ID_CONTRATACAO = @ID_CONTRATACAO_NOVO AND
ID_COMPETENCIA=@ID_COMPETENCIA
IF(@ENCONTROU = 0)
BEGIN
INSERT INTO CAD_CUSTO_PRODUTO
VALUES (@ID_CONTRATACAO_NOVO, @ID_COMPETENCIA, NULL, 0, 0, 0, @VALOR_LIGACOES_DDD_FIXO_NOVO,
@VALOR_LIGACOES_DDD_MOVEL_NOVO, @VALOR_LIGACOES_LOCAL_MOVEL_NOVO, @VALOR_LIGACOES_LOCAL_FIXO_NOVO,
@VALOR_LIGACOES_DDI_NOVO, @VALOR_LIGACOES_VOIP_NOVO, @VALOR_LIGACOES_TOM_REMOTO_NOVO)
END
ELSE
BEGIN
IF (@FOI_CANCELADO_NOVO = 1)
BEGIN
UPDATE CAD_CUSTO_PRODUTO
SET VALOR_LIGACOES_DDD_FIXO = VALOR_LIGACOES_DDD_FIXO - @VALOR_LIGACOES_DDD_FIXO_ATUAL,
VALOR_LIGACOES_DDD_MOVEL = VALOR_LIGACOES_DDD_MOVEL - @VALOR_LIGACOES_DDD_MOVEL_ATUAL,
VALOR_LIGACOES_LOCAL_MOVEL = VALOR_LIGACOES_LOCAL_MOVEL - @VALOR_LIGACOES_LOCAL_MOVEL_ATUAL,
VALOR_LIGACOES_LOCAL_FIXO = VALOR_LIGACOES_LOCAL_FIXO - @VALOR_LIGACOES_LOCAL_FIXO_ATUAL,
VALOR_LIGACOES_DDI = VALOR_LIGACOES_DDI - @VALOR_LIGACOES_DDI_ATUAL,
VALOR_LIGACOES_VOIP = VALOR_LIGACOES_VOIP - @VALOR_LIGACOES_VOIP_ATUAL,
VALOR_LIGACOES_TOM_REMOTO = VALOR_LIGACOES_TOM_REMOTO - @VALOR_LIGACOES_TOM_REMOTO_ATUAL
WHERE ID_CONTRATACAO = @ID_CONTRATACAO_ATUAL AND ID_COMPETENCIA = @ID_COMPETENCIA
END
ELSE
BEGIN
UPDATE CAD_CUSTO_PRODUTO
SET VALOR_LIGACOES_DDD_FIXO = VALOR_LIGACOES_DDD_FIXO + (@VALOR_LIGACOES_DDD_FIXO_NOVO - @VALOR_LIGACOES_DDD_FIXO_ATUAL),
VALOR_LIGACOES_DDD_MOVEL = VALOR_LIGACOES_DDD_MOVEL + (@VALOR_LIGACOES_DDD_MOVEL_NOVO - @VALOR_LIGACOES_DDD_MOVEL_ATUAL),
VALOR_LIGACOES_LOCAL_MOVEL = VALOR_LIGACOES_LOCAL_MOVEL + (@VALOR_LIGACOES_LOCAL_MOVEL_NOVO - @VALOR_LIGACOES_LOCAL_MOVEL_ATUAL),
VALOR_LIGACOES_LOCAL_FIXO = VALOR_LIGACOES_LOCAL_FIXO + (@VALOR_LIGACOES_LOCAL_FIXO_NOVO - @VALOR_LIGACOES_LOCAL_FIXO_ATUAL),
VALOR_LIGACOES_DDI = VALOR_LIGACOES_DDI + (@VALOR_LIGACOES_DDI_NOVO - @VALOR_LIGACOES_DDI_ATUAL),
VALOR_LIGACOES_VOIP = VALOR_LIGACOES_VOIP + (@VALOR_LIGACOES_VOIP_NOVO - @VALOR_LIGACOES_VOIP_ATUAL),
VALOR_LIGACOES_TOM_REMOTO = VALOR_LIGACOES_TOM_REMOTO + (@VALOR_LIGACOES_TOM_REMOTO_NOVO - @VALOR_LIGACOES_TOM_REMOTO_ATUAL)
WHERE ID_CONTRATACAO = @ID_CONTRATACAO_ATUAL AND ID_COMPETENCIA = @ID_COMPETENCIA
END
END
END
UPDATE CAD_BILHETES
SET ID_PREFIXO = I.ID_PREFIXO,
ID_PRODUTO = I.ID_PRODUTO,
ID_COMPETENCIA = I.ID_COMPETENCIA,
DATA_HORA = I.DATA_HORA,
DURACAO = I.DURACAO,
TIPO = I.TIPO,
NUMERO_EXTERNO = I.NUMERO_EXTERNO,
RAMAL = I.RAMAL,
SENHA_AUTORIZACAO = I.SENHA_AUTORIZACAO,
CODIGO_DEPENDENCIA = I.CODIGO_DEPENDENCIA,
CRITICA = I.CRITICA,
[STATUS] = I.STATUS,
VALOR = I.VALOR,
SEQUENCIAL = I.SEQUENCIAL,
FOI_TARIFADO = I.FOI_TARIFADO,
FOI_CANCELADO = I.FOI_CANCELADO,
DURACAO_TARIFACAO = I.DURACAO_TARIFACAO
FROM INSERTED AS I
WHERE CAD_BILHETES.ID = I.ID
END

insertedordeletedtables only has one row and is treating a select from one or other of them as a scalar. The line number presumably refers to a different line than the one you have identified. I can't remember if it includes theCREATE TRIGGERheader. – Martin Smith Oct 22 '12 at 13:05SET @ID = (SELECT ID FROM INSERTED). You need to rewrite (at least part of) the trigger to take into account thatinsertedcan contain multiple (or zero) rows not just exactly one. – Martin Smith Oct 22 '12 at 13:11INSERTEDis a pseudo table containing all rows affected by the update statement. – Martin Smith Oct 22 '12 at 13:13=seek on a scalar variable. – Martin Smith Oct 22 '12 at 13:24