Sql 获取变量名'@错误消息';已经申报了
我有一个SQL server脚本,它包含多个批处理,带有Sql 获取变量名'@错误消息';已经申报了,sql,sql-server,Sql,Sql Server,我有一个SQL server脚本,它包含多个批处理,带有try-catch。我运行了脚本,出现以下错误: 变量名“@ErrorMessage”已声明。变量名在查询批处理或存储过程中必须是唯一的 我在多个地方声明了变量,但它位于每个catch begin。。结束范围。不知道为什么会抛出错误 我尝试在开始事务之前和之后移动声明,但是我得到了 必须声明标量变量“@ErrorMessage” 如何修复此错误 USE [TestWebDb2_Local] GO SET ANSI_NULLS ON GO
try-catch
。我运行了脚本,出现以下错误:
变量名“@ErrorMessage”已声明。变量名在查询批处理或存储过程中必须是唯一的
我在多个地方声明了变量,但它位于每个catch begin。。结束
范围。不知道为什么会抛出错误
我尝试在开始事务之前和之后移动声明,但是我得到了
必须声明标量变量“@ErrorMessage”
如何修复此错误
USE [TestWebDb2_Local]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
SET XACT_ABORT ON
GO
BEGIN TRANSACTION
BEGIN TRY
IF COLUMNPROPERTY(OBJECT_ID('[dbo].[MY_TABL]'), 'MY_REQID', 'ColumnId') IS NULL
BEGIN
ALTER TABLE [dbo].[MY_TABL] ADD MY_REQID INT NOT NULL DEFAULT(0)
END
IF COLUMNPROPERTY(OBJECT_ID('dbo.MY_TABL'), 'MY_ISCOMPLETED', 'ColumnId') IS NULL
BEGIN
ALTER TABLE [dbo].[MY_TABL] ADD MY_ISCOMPLETED BIT NOT NULL DEFAULT(0)
END
END TRY
BEGIN CATCH
-- Test whether the transaction is uncommittable.
IF (XACT_STATE()) = -1
BEGIN
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
PRINT 'The transaction from Alter table is in an uncommittable state.' +
' Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
END CATCH;
GO
BEGIN TRY
UPDATE [dbo].[MY_TABL] SET MY_REQID = 20 WHERE PENDTRANS_ABBREV = '1035'
END TRY
BEGIN CATCH
-- Test whether the transaction is uncommittable.
IF (XACT_STATE()) = -1
BEGIN
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
PRINT 'The transaction from UPDATE table is in an uncommittable state.' +
' Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
END CATCH;
BEGIN TRY
CREATE UNIQUE NONCLUSTERED INDEX idxReqId ON [dbo].[MY_TABL](MY_REQID)
PRINT 'Index created'
END TRY
BEGIN CATCH
-- Test whether the transaction is uncommittable.
IF (XACT_STATE()) = -1
BEGIN
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
PRINT 'The transaction from Create Index is in an uncommittable state.' +
' Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
END CATCH;
GO
if XACT_STATE() = 1
BEGIN
COMMIT TRANSACTION
PRINT 'Transaction committed.';
END;
变量适用于整个批次,最典型的是由GO
语句分隔;T-SQL不使用BEGIN
/END
来确定范围。因此,第二个和第三个TRY
/CATCH
块需要一个GO
来将它们分开,因为这将使它们分开批次。变量对整个批次有效,这通常由GO
语句分开;T-SQL不使用BEGIN
/END
来确定范围。因此,第二个和第三个TRY
/CATCH
块需要一个GO
来将它们分开,因为这将使它们分开批次