Простой SQL UPDATE работает в консоли, но не как хранимая процедура - PullRequest
0 голосов
/ 04 мая 2018

Я знаю, что это очень простая подпрограмма SQL, поэтому я не совсем понимаю, почему она на самом деле не ОБНОВЛЯЕТСЯ.

Они отлично работают самостоятельно:

UPDATE ourwebsite.dbo.dealer 
SET Active = 0
WHERE  dealercode = 12345

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  dealercode = 12345

Но когда я пытаюсь превратить их в хранимую процедуру, они выглядят нормально и выполняются нормально, но ничего не обновляется.

@DealerCode VARCHAR
AS
SET NOCOUNT ON;
UPDATE ourwebsite.dbo.dealer 
SET Active = 0
WHERE  DealerCode = @DealerCode

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  DealerCode = @DealerCode 
END TRY

Я уверен, что что-то упустил?

Спасибо за внимание.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

от вашего запроса

UPDATE ourwebsite.dbo.dealer 
SET Active = 0
WHERE  dealercode = 12345

UPDATE ourwebsite.dbo.reps 
SET username = username + '_LR-3.0'
WHERE  dealercode = 12345

Я предположил, что тип дилерского кода является числовым, потому что вы не поставили ('...') на 12345, вы можете попробовать этот запрос, который я немного изменил в нем

AS @DealerCode NUMERIC

BEGIN TRANSACTION

BEGIN TRY  
    SET NOCOUNT ON;
    UPDATE ourwebsite.dbo.dealer 
    SET Active = 0
    WHERE  DealerCode = @DealerCode

    UPDATE ourwebsite.dbo.reps 
    SET username = username + '_LR-3.0'
    WHERE  DealerCode = @DealerCode 

    -- Commit the updates into the table
    COMMIT TRANSACTION

END TRY  
BEGIN CATCH  

    -- Execute rollback upon error retrieval routine.  
    ROLLBACK TRANSACTION 

END CATCH;  
0 голосов
/ 04 мая 2018

Трудно не увидеть всю вашу процедуру, так как внизу есть END TRY без BEGIN TRY, поэтому ваши операторы могут даже не выполняться, потому что выполнение переходит к CATCH. Также убедитесь, что вы не начинаете транзакцию, не совершив ее.

Кроме этого, существует разница между вашим ручным запросом и вашей процедурой, типом которой является @DealerCode. В вашем ручном запросе это INT (или числовой), а в вашем SP это VARCHAR необъявленной длины. Проверьте, какой тип данных является вашим столбцом dealercode из таблицы ourwebsite.dbo.reps, и убедитесь, что ваша переменная того же типа. Также всегда указывайте длину ваших полей VARCHAR.

Протестируйте следующий код, и он обновит ваши записи , так же как и ваш отдельный запрос:

CREATE PROCEDURE dbo.TestUpdate
    @dealercode INT
AS
BEGIN

    UPDATE ourwebsite.dbo.dealer 
    SET Active = 0
    WHERE  dealercode = @dealercode

    UPDATE ourwebsite.dbo.reps 
    SET username = username + '_LR-3.0'
    WHERE  dealercode = @dealercode

END

Если это сработает, либо удалите BEGIN TRY ... END TRY и все ваши CATCH, чтобы точно увидеть ошибку, которую вы получаете, либо убедитесь, что вы сделали RAISERROR в своем улове с соответствующим ERROR_MESSAGE(). Пример:

CREATE PROCEDURE dbo.YourProcedure
    @dealercode VARCHAR(20)
AS
BEGIN

    BEGIN TRY

        -- Your operations here
        SELECT 1 / 0

    END TRY

    BEGIN CATCH

        DECLARE @v_ErrorMessage VARCHAR(MAX) = CONVERT(VARCHAR(MAX), ERROR_MESSAGE())

        -- Rollback if you have to

        RAISERROR (@v_ErrorMessage, 16, 1)

    END CATCH

END
0 голосов
/ 04 мая 2018

Вы не указали длину для своего параметра

@DealerCode VARCHAR

поэтому по умолчанию он принимает значение VARCHAR (1). Вы можете распечатать или выбрать @DealerCode в своей процедуре, чтобы проверить то же самое.

...