Array
(
)

Problemas com Commit Transaction

Robertolucio
   - 23 ago 2004

Boa tarde a todos,

Estou trabalhando a pouco mais de um mês com o SQL Server e estou com um problema referente ao Commit Transaction.

Preciso criar uma stored procedure com o seguinte script:

-- Inicio do script
IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE id = OBJECT_ID(N´[dbo].[PNS_Apaga_Mercadoria_Grade]´)
AND OBJECTPROPERTY(ID, N´IsProcedure´) = 1)
DROP PROCEDURE [dbo].[PNS_Apaga_Mercadoria_Grade]
GO
CREATE PROCEDURE PNS_Apaga_Mercadoria_Grade (@cod_empresa integer) AS
--===============================================================================================
--== Versão: 2.22.06 ==
--== Data: 23/08/2004 Hora: 14:10 ==
--== ==
--== PROCEDURE PNS_Apaga_Mercadoria_Grade ==
--== ==
--== ==
--== Essa procedure apaga as grades das mercadorias da empresa passada como parâmetro que não ==
--== possuam dados nas tabelas: Pagar_Movto, Devolucao_Movto, Contrato_Movto, Dev_Comp_Movto, ==
--== Acerto_Estoque, Transf_Movto, Contagem_Estoque, PV_Movto, PC_Movto e Ped_Comp_Merc_Movto. ==
--== ==
--===============================================================================================
DECLARE @TranNome varchar(16)
SELECT @TranNome = ´Apaga_Mercadoria´
BEGIN TRANSACTION @TranNome
DECLARE @cod_mercadoria integer, @cod_cor integer, @tamanho varchar(4)
DECLARE Mercadorias CURSOR FOR SELECT B.Cod_Mercadoria, B.Tamanho, B.Cod_Cor FROM Mercadoria_Grade as B WHERE B.Cod_empresa = @cod_empresa
AND NOT EXISTS(SELECT * FROM Pagar_Movto as A WHERE A.Cod_empresa = B.Cod_Empresa AND A.Cod_Mercadoria = B.Cod_Mercadoria) -- AND A.Tamanho = B.Tamanho AND A.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Devolucao_Movto as C WHERE C.Cod_empresa = B.Cod_Empresa AND C.Cod_Mercadoria = B.Cod_Mercadoria AND C.Tamanho=B.Tamanho AND C.Cod_Cor=B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Contrato_Movto as D WHERE D.empresa = B.Cod_Empresa AND D.Cod_Mercadoria = B.Cod_Mercadoria AND D.Tamanho = B.Tamanho AND D.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Dev_Comp_Movto as E WHERE E.Cod_empresa = B.Cod_Empresa AND E.Cod_Mercadoria = B.Cod_Mercadoria AND E.Tamanho = B.Tamanho AND E.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Acerto_Estoque as F WHERE F.Cod_empresa = B.Cod_Empresa AND F.Cod_Mercadoria = B.Cod_Mercadoria AND F.Tamanho = B.Tamanho AND F.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Transf_Movto as G WHERE G.empresa = B.Cod_Empresa AND G.Cod_Mercadoria = B.Cod_Mercadoria AND G.Tamanho = B.Tamanho AND G.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Contagem_Estoque as H WHERE H.Cod_empresa = B.Cod_Empresa AND H.Cod_Mercadoria = B.Cod_Mercadoria AND H.Tamanho = B.Tamanho AND H.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM PV_Movto as I WHERE I.Cod_empresa = B.Cod_Empresa AND I.Cod_Mercadoria = I.Cod_Mercadoria AND I.Tamanho = B.Tamanho AND I.Cod_Cor = B. Cod_Cor)
AND NOT EXISTS(SELECT * FROM PC_Movto as J WHERE J.Cod_empresa = B.Cod_Empresa AND J.Codigo = B.Cod_Mercadoria AND J.Tamanho = B.Tamanho AND J.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Ped_Comp_Merc_Movto as K WHERE K.Cod_empresa = B.Cod_Empresa AND K.Cod_Mercadoria = B.Cod_Mercadoria AND K.Tamanho = B.Tamanho AND K.Cod_Cor = B.Cod_Cor)
OPEN Mercadorias
FETCH NEXT FROM Mercadorias INTO @cod_mercadoria, @tamanho, @cod_cor
WHILE (@@fetch_status = 0)
BEGIN
DELETE FROM Mercadoria_Totais WHERE Mercadoria_Totais.Cod_Empresa = @cod_empresa AND Mercadoria_Totais.Cod_Mercadoria = @cod_mercadoria
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_Totais com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
DELETE FROM Mercadoria_Grade WHERE Mercadoria_Grade.Cod_Empresa = @cod_empresa AND Mercadoria_Grade.Cod_Mercadoria = @cod_mercadoria AND Mercadoria_Grade.Cod_Cor = @cod_cor AND Mercadoria_Grade.Tamanho = @tamanho
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_Grade com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´com o Tamanho: ´+@tamanho+´com a cor: ´+cast(@cod_cor as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
DELETE FROM Mercadoria_ICMS WHERE Mercadoria_ICMS.Cod_Mercadoria = @cod_mercadoria
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_ICMS com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
DELETE FROM Mercadoria_Cad WHERE Mercadoria_Cad.Cod_Mercadoria = @cod_mercadoria
AND NOT EXISTS (SELECT * FROM Mercadoria_Grade AS B WHERE B.Cod_Mercadoria = @cod_mercadoria)
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_Cad com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
FETCH NEXT FROM Mercadorias INTO @cod_mercadoria, @tamanho, @cod_cor
END
CLOSE Mercadorias
DEALLOCATE Mercadorias
GO
COMMIT TRANSACTION Apaga_Mercadoria
GO

-- Fim do script

Quando eu vou executá-lo aparece a seguinte mensagem de erro:
Server: Msg 3902, Level 16, State 1, Line 1
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

O que está errado?
Não posso usar COMMIT dentro de uma SP?
Obrigado a todos pela atenção!

Marcus.magalhaes
   - 23 ago 2004

Justino, boa tarde.

2 coisas.

No Begin Transaction vc pode colocar o nome ao invés de uma váriavel, pq vc irá referencia-lo pelo nome.

e o error acontece pq vc tem um GO antes do COMMIT, quando vc colocou este GO, ele compila a proc naquele ponto e o begin tran fica sem commit e o commit fica sem begin tran

A proc fica assim

IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE id = OBJECT_ID(N´[dbo].[PNS_Apaga_Mercadoria_Grade]´)
AND OBJECTPROPERTY(ID, N´IsProcedure´) = 1)
DROP PROCEDURE [dbo].[PNS_Apaga_Mercadoria_Grade]
GO
CREATE PROCEDURE PNS_Apaga_Mercadoria_Grade (@cod_empresa integer) AS
--===============================================================================================
--== Versão: 2.22.06 ==
--== Data: 23/08/2004 Hora: 14:10 ==
--== ==
--== PROCEDURE PNS_Apaga_Mercadoria_Grade ==
--== ==
--== ==
--== Essa procedure apaga as grades das mercadorias da empresa passada como parâmetro que não ==
--== possuam dados nas tabelas: Pagar_Movto, Devolucao_Movto, Contrato_Movto, Dev_Comp_Movto, ==
--== Acerto_Estoque, Transf_Movto, Contagem_Estoque, PV_Movto, PC_Movto e Ped_Comp_Merc_Movto. ==
--== ==
--===============================================================================================
BEGIN TRANSACTION Apaga_Mercadoria
DECLARE @cod_mercadoria integer, @cod_cor integer, @tamanho varchar(4)
DECLARE Mercadorias CURSOR FOR SELECT B.Cod_Mercadoria, B.Tamanho, B.Cod_Cor FROM Mercadoria_Grade as B WHERE B.Cod_empresa = @cod_empresa
AND NOT EXISTS(SELECT * FROM Pagar_Movto as A WHERE A.Cod_empresa = B.Cod_Empresa AND A.Cod_Mercadoria = B.Cod_Mercadoria) -- AND A.Tamanho = B.Tamanho AND A.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Devolucao_Movto as C WHERE C.Cod_empresa = B.Cod_Empresa AND C.Cod_Mercadoria = B.Cod_Mercadoria AND C.Tamanho=B.Tamanho AND C.Cod_Cor=B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Contrato_Movto as D WHERE D.empresa = B.Cod_Empresa AND D.Cod_Mercadoria = B.Cod_Mercadoria AND D.Tamanho = B.Tamanho AND D.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Dev_Comp_Movto as E WHERE E.Cod_empresa = B.Cod_Empresa AND E.Cod_Mercadoria = B.Cod_Mercadoria AND E.Tamanho = B.Tamanho AND E.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Acerto_Estoque as F WHERE F.Cod_empresa = B.Cod_Empresa AND F.Cod_Mercadoria = B.Cod_Mercadoria AND F.Tamanho = B.Tamanho AND F.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Transf_Movto as G WHERE G.empresa = B.Cod_Empresa AND G.Cod_Mercadoria = B.Cod_Mercadoria AND G.Tamanho = B.Tamanho AND G.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Contagem_Estoque as H WHERE H.Cod_empresa = B.Cod_Empresa AND H.Cod_Mercadoria = B.Cod_Mercadoria AND H.Tamanho = B.Tamanho AND H.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM PV_Movto as I WHERE I.Cod_empresa = B.Cod_Empresa AND I.Cod_Mercadoria = I.Cod_Mercadoria AND I.Tamanho = B.Tamanho AND I.Cod_Cor = B. Cod_Cor)
AND NOT EXISTS(SELECT * FROM PC_Movto as J WHERE J.Cod_empresa = B.Cod_Empresa AND J.Codigo = B.Cod_Mercadoria AND J.Tamanho = B.Tamanho AND J.Cod_Cor = B.Cod_Cor)
AND NOT EXISTS(SELECT * FROM Ped_Comp_Merc_Movto as K WHERE K.Cod_empresa = B.Cod_Empresa AND K.Cod_Mercadoria = B.Cod_Mercadoria AND K.Tamanho = B.Tamanho AND K.Cod_Cor = B.Cod_Cor)
OPEN Mercadorias
FETCH NEXT FROM Mercadorias INTO @cod_mercadoria, @tamanho, @cod_cor
WHILE (@@fetch_status = 0)
BEGIN
DELETE FROM Mercadoria_Totais WHERE Mercadoria_Totais.Cod_Empresa = @cod_empresa AND Mercadoria_Totais.Cod_Mercadoria = @cod_mercadoria
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_Totais com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
DELETE FROM Mercadoria_Grade WHERE Mercadoria_Grade.Cod_Empresa = @cod_empresa AND Mercadoria_Grade.Cod_Mercadoria = @cod_mercadoria AND Mercadoria_Grade.Cod_Cor = @cod_cor AND Mercadoria_Grade.Tamanho = @tamanho
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_Grade com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´com o Tamanho: ´+@tamanho+´com a cor: ´+cast(@cod_cor as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
DELETE FROM Mercadoria_ICMS WHERE Mercadoria_ICMS.Cod_Mercadoria = @cod_mercadoria
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_ICMS com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
DELETE FROM Mercadoria_Cad WHERE Mercadoria_Cad.Cod_Mercadoria = @cod_mercadoria
AND NOT EXISTS (SELECT * FROM Mercadoria_Grade AS B WHERE B.Cod_Mercadoria = @cod_mercadoria)
if @@error <> 0
BEGIN
SELECT ´Erro na exclusão da Tabela Mercadoria_Cad com a Mercadoria: ´+cast(@cod_mercadoria as varchar(10))+´ na empresa: ´+cast(@cod_empresa as varchar(10))
ROLLBACK TRANSACTION Apaga_Mercadoria
RETURN
END
FETCH NEXT FROM Mercadorias INTO @cod_mercadoria, @tamanho, @cod_cor
END
CLOSE Mercadorias
DEALLOCATE Mercadorias
COMMIT TRANSACTION Apaga_Mercadoria
GO

Att,

Robertolucio
   - 23 ago 2004

Marcus, muito obrigado!