Должен объявить скалярную переменную "@SAMPLE_STATUS" - PullRequest
0 голосов
/ 26 января 2020

Мне нужно создать хранимую процедуру и обновить состояние образца в зависимости от значения sample_status, возвращаемого системой, но я получил эту ошибку при выполнении процедуры:

Сообщение 137, Уровень 15, Состояние 2, Строка 14
Необходимо объявить скалярную переменную "@SAMPLE_STATUS".

Это хранимая процедура:

CREATE PROCEDURE [dbo].[UPDATE_SAMPLE_DETAILS_STATUS]
    @ORDER_ID int,
    @TESTID int,
    @SAMPLE_STATUS int
AS 
    IF (@SAMPLE_STATUS = 1)
    BEGIN
        UPDATE [Lab_Hematology_Samples_Details]
        SET SAMPLE_STATUS = 2
        WHERE ORDER_ID = @ORDER_ID
          AND testid = @testid
    END
    ELSE IF (@SAMPLE_STATUS = 2)
    BEGIN
        UPDATE [Lab_Hematology_Samples_Details]
        SET SAMPLE_STATUS = 3
        WHERE ORDER_ID = @ORDER_ID
          AND testid = @testid
    END
    ELSE IF (@SAMPLE_STATUS = 3)
    BEGIN 
        UPDATE [Lab_Hematology_Samples_Details]
        SET SAMPLE_STATUS = 4
        WHERE ORDER_ID = @ORDER_ID
          AND testid = @testid
    END
    ELSE IF (@SAMPLE_STATUS = 4)
    BEGIN
        UPDATE [Lab_Hematology_Samples_Details]
        SET SAMPLE_STATUS = 5
        WHERE ORDER_ID = @ORDER_ID
          AND testid = @testid
    END
    ELSE IF (@SAMPLE_STATUS = 5)
    BEGIN
        UPDATE [Lab_Hematology_Samples_Details]
        SET SAMPLE_STATUS = 6
        WHERE ORDER_ID = @ORDER_ID
          AND testid = @testid
    END

Где объявить @SAMPLE_STATUS для решения этой ошибки?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

В вашем коде нет ничего явно неправильного: переменная @SAMPLE_STATUS, кажется, существует там, где она требуется.

Однако эту процедуру можно улучшить, используя set-logi c с процедурным программированием. Следующее обновление выполняет то же самое, используя set-logi c и, надеюсь, также удаляет все ошибки:

CREATE PROCEDURE [dbo].[UPDATE_SAMPLE_DETAILS_STATUS]
(
  @ORDER_ID int
  , @TESTID int
  , @SAMPLE_STATUS int
)
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE [Lab_Hematology_Samples_Details]
    SET SAMPLE_STATUS = @SAMPLE_STATUS + 1
  WHERE ORDER_ID = @ORDER_ID
  AND TESTID = @TESTID
  AND @SAMPLE_STATUS < 6;
END
2 голосов
/ 26 января 2020

Не проще ли написать следующее?

create proc [dbo].[UPDATE_SAMPLE_DETAILS_STATUS] (
    @ORDER_ID int,
    @TESTID int,
    @SAMPLE_STATUS int
) AS
BEGIN
    UPDATE [Lab_Hematology_Samples_Details]
        SET SAMPLE_STATUS = @SAMPLE_STATUS + 1
        WHERE ORDER_ID = @ORDER_ID AND
              testid = @testid AND
              @SAMPLE_STATUS IN (1, 2, 3, 4, 5);
END;

В некоторых случаях это может не совпадать с логикой c (особенно если несколько строк соответствуют WHERE условия). Но, похоже, это то, что вы намереваетесь.

Ошибка в вашем коде не совсем очевидна. Я рекомендую заключить тело хранимой процедуры в блок BEGIN / END; это может предотвратить некоторые неожиданные синтаксические ошибки.

...