0
I’m trying to make my previous run and return the registration ID that has just been created, as I don’t have much knowledge of cursors and procedures I don’t know where I am failing.
When I run the program I get the message (Message 3903, Level 16, Status 1, Procedure spClonaPedido, Line 59 The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.)
Below follows the way I am calling the Code and the Code, can anyone help me and explain to me what is going on? I built this code by searching the MS documents and had some tips.
The way I call Procedure:
'''
USE [BANCO]
GO
DECLARE @return_value int,
@NovoId int
EXEC @return_value = [dbo].[spClonaPedido]
@PedidoId = 87163,
@NovoId = @NovoId OUTPUT
SELECT @NovoId as N'@NovoId'
SELECT 'Return Value' = @return_value
GO
'''
Below is the code of the trial:
'''
USE [BANCO]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spClonaPedido]
-- Add the parameters for the stored procedure here
@PedidoId int,
@NovoId int output
AS
BEGIN TRY
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET CURSOR_CLOSE_ON_COMMIT ON;
DECLARE @COLUNA VARCHAR(100), @COLUNAS NVARCHAR(MAX), @CLONAR NVARCHAR(MAX), @vInsertInto NVARCHAR(MAX);
--- Inicializar a variavel
SET @COLUNAS = '';
SET @CLONAR = '';
--sempre declare que o cursor é do tipo LOCAL FAST_FORWARD.
--Local diz que é o scopo da execuçao e FAST_FORWARD significa que ele so vai pra frente.
DECLARE CURCOLUNAS CURSOR LOCAL FAST_FORWARD FOR SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'BANCO'
AND TABLE_SCHEMA= 'dbo'
AND TABLE_NAME = 'TABELA'
ORDER BY ORDINAL_POSITION
OPEN CURCOLUNAS
FETCH NEXT FROM CURCOLUNAS INTO @COLUNA
WHILE @@FETCH_STATUS = 0
BEGIN
SET @COLUNAS = @COLUNAS + ',' + @COLUNA
FETCH NEXT FROM CURCOLUNAS INTO @COLUNA --- O into nesta linha
END
SET @COLUNAS= Right(@COLUNAS, len(@COLUNAS)-10)
SET @vInsertInto = N'INSERT INTO TABELA ('+@COLUNAS+') SELECT '+@COLUNAS+' FROM TABELA WHERE PedidoId = '+@PedidoId;
--SET IDENTITY_INSERT [BANCO].[dbo].[TABELA] ON
BEGIN TRANSACTION;
--EXECUTE sp_executesql @CLONAR;
EXECUTE sp_executesql @vInsertInto;
SET @NovoId=SCOPE_IDENTITY();
RETURN @NovoId;
COMMIT TRANSACTION;
--SET IDENTITY_INSERT [BANCO].[dbo].[TABELA] OFF
CLOSE CURCOLUNAS;
DEALLOCATE CURCOLUNAS;
End TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
'''