Как исправить ошибку Имя переменной уже объявлено. Имена переменных должны быть уникальными в пакете запросов или хранимой процедуре? - PullRequest
0 голосов
/ 06 августа 2020

Я создаю сценарий на SQL сервере, который объединяет несколько запросов. В каждом запросе я объявляю переменную @FieldName. Когда я запускаю сценарий, он выдает следующую ошибку.

Сообщение 134, уровень 15, состояние 1, строка 24 Имя переменной «@FieldName» уже объявлено. Имена переменных должны быть уникальными в пакете запросов или хранимой процедуре.

У этих запросов больше кода, я просто предоставляю минимальный код.

Скрипт :

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 ]

0 голосов
/ 06 августа 2020

Если вы не используете оператор GO, вы можете объявить переменную один раз в своем операторе SQL

Объявите эту переменную в верхней части оператора и просто измените значение под каждым блоком

0 голосов
/ 06 августа 2020

Есть 2 возможности. используйте GO для разделения партий. (Фактическое разделение области запроса. Все предыдущие объявленные переменные недоступны в следующем пакете запроса.)

Или объявите переменную только один раз и используйте SET В большинстве случаев вам понадобится вариант 2 , чтобы повторно использовать объявление. Но иногда, когда у вас есть операторы, требующие GO (СОЗДАТЬ ВИД), вам нужно go с опцией 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
...