如何修复错误 变量名已经声明。变量名称在查询批处理或存储过程中必须是唯一的?

How to fix error The variable name has already been declared. Variable names must be unique within a query batch or stored procedure?

我正在 SQL 服务器中创建一个结合了多个查询的脚本。在每个查询中,我都声明了一个变量 @FieldName。当我 运行 脚本出现以下错误时。

Msg 134, Level 15, State 1, Line 24 The variable name '@FieldName' has already been declared. Variable names must be unique within a query batch or stored procedure.

这些查询有更多的代码,我只提供最少的代码。

脚本:

BEGIN TRY 
    BEGIN TRANSACTION 

    Print '1'
        DECLARE @FieldName NVARCHAR(100) = 'Bank Name'; 
        

        COMMIT TRANSACTION 

        END TRY

        
BEGIN CATCH 
    PRINT 'Error' 
 
END CATCH



BEGIN TRY 
    BEGIN TRANSACTION 

    
        DECLARE @FieldName NVARCHAR(100) = 'Account Number'; 

        COMMIT TRANSACTION 

        END TRY

        
BEGIN CATCH 
    PRINT 'Error' 
 
END CATCH

我们如何解决这个问题?

有2种可能。使用 GO 分隔批次。 (有效分割查询范围,之前声明的所有变量在下一批查询中不可用。)

或者只声明一次变量并使用SET 大多数时候你会想要选项 2,重用声明。但有时当您有需要 GO (CREATE VIEW) 的语句时,您需要使用选项 1.

选项 1

BEGIN TRY 
    BEGIN TRANSACTION 

    Print '1'
        DECLARE @FieldName NVARCHAR(100) = 'Bank Name'; 
        

        COMMIT TRANSACTION 

        END TRY

        
BEGIN CATCH 
    PRINT 'Error' 
 
END CATCH

GO -- Batch seperator

BEGIN TRY 
    BEGIN TRANSACTION 

    
        DECLARE @FieldName NVARCHAR(100) = 'Account Number'; 

        COMMIT TRANSACTION 

        END TRY

        
BEGIN CATCH 
    PRINT 'Error' 
 
END CATCH

选项 2

DECLARE @FieldName NVARCHAR(100) -- Declare once

BEGIN TRY 
    BEGIN TRANSACTION 

    Print '1'
        SET @FieldName  = 'Bank Name';  -- Use Set to set the value


        COMMIT TRANSACTION 

        END TRY


BEGIN CATCH 
    PRINT 'Error' 

END CATCH


BEGIN TRY 
    BEGIN TRANSACTION 


        SET @FieldName = 'Account Number';  -- Use Set to set the value

        COMMIT TRANSACTION 

        END TRY


BEGIN CATCH 
    PRINT 'Error' 

END CATCH

除非您使用 GO 语句,否则您可以在 SQL 语句中声明一次变量

在语句的顶部声明该变量,只更改每个块下的值