Хранимая процедура: обновить столбец с условным условием

#sql #sql-server #stored-procedures

#sql #sql-сервер #хранимые процедуры

Вопрос:

 ALTER PROCEDURE UpdateStatus
    @HealthStatus NVARCHAR (MAX),
    @Risk NVARCHAR (MAX),
    @Job NVARCHAR(MAX),
    @JobStatus NVARCHAR(MAX)    
AS
BEGIN
    SET @HealthStatus = (SELECT [Health Status] FROM [tbl1])
    SET @Risk = (SELECT [Risk Level] FROM [tbl1])
    SET @Job = (SELECT [Job] FROM [tbl1])
    SET @JobStatus = (SELECT [Detail status] FROM [tbl1])
    
    IF @HealthStatus = 'Y'
        BEGIN
            UPDATE [tbl1] 
            SET [Overall Status] = 'Pass' 
            WHERE [Health Status] = @HealthStatus
    END
    ELSE IF @HealthStatus = 'N'
        BEGIN
            UPDATE [tbl1] 
            SET [Overall Status] = 'Fail' 
            WHERE [Health Status] = @HealthStatus
    END
    ELSE IF @Risk = 'No Risk'
        BEGIN
            UPDATE [tbl1] 
            SET [Overall Status] = 'Pass and No Risk' 
            WHERE [Risk Level] = @Risk
    END
    ELSE IF @Risk = 'Not Applicable'
        BEGIN
            UPDATE [tbl1] 
            SET [Overall Status] = 'Pass and No Risk'
            WHERE [Risk Level] = @Risk
    END
    IF @Risk = 'High Risk' AND (@HealthStatus = 'U' OR @HealthStatus = '')
        IF @Job = ''
            BEGIN
                UPDATE [tbl1] 
                SET [Overall Status] = @JobStatus
                WHERE [Health Status] = @HealthStatus AND [Risk Level] = @Risk AND [Job] = @Job
            END
        ELSE IF @Job = ''
            BEGIN
                UPDATE [tbl1] 
                SET [Overall Status] = 'Undefined' 
                WHERE [Health Status] = @HealthStatus AND [Risk Level] = @Risk AND [Job] = @Job
            END
END
GO
  

Я написал хранимую процедуру для обновления общего состояния на основе входных данных из других столбцов в той же таблице, которые я буду выполнять на сервере SQL. Однако я наткнулся:

Процедура или функция ‘UpdateStatus’ ожидает параметр ‘@HealthStatus’, который не был предоставлен.

Я присвоил значение параметру с помощью функции ВЫБОРА. Я новичок в хранимой процедуре, и я не уверен, что я здесь делаю не так.

Я написал вызывающий код только внутри sql server

 EXEC UpdateStatus
  

Комментарии:

1. Вам нужно показать нам вызывающий код, вот где ошибка.

2. Вам нужно передать параметры, если у них нет значений по умолчанию!

Ответ №1:

Похоже, вам вообще не нужны параметры, если вы не планируете их использовать. вы уже создали переменные. Параметры предназначены для передачи значений во время выполнения

 Exec dbo.SomeProc @param1 = 'testvalue'
  

Также ваша процедура зависит от того, что в tbl1 есть только 1 строка.

 SET @HealthStatus = (SELECT [Health Status] FROM [tbl1])
  

Если в таблице больше 1 строки, то вы просто получите значение в последней строке.
Ваши инструкции по обновлению могут повлиять на многие строки

Я думаю, что вам нужно что-то вроде этого..

 ALTER PROCEDURE dbo.UpdateStatus 
AS
BEGIN

    UPDATE dbo.tbl1
    SET [Overall Status] = CASE WHEN [Health Status] = 'Y' AND ([Risk Level] = 'No Risk' OR [Risk Level] = 'Not Applicable') THEN 'Pass and No Risk' 
                                WHEN ([Health Status] = 'U' OR [Health Status] = '') AND [Risk Level] 'High Risk' THEN 'Pass and No Risk' 
                                ...
                            END
                            
END
GO
  

вы могли бы даже отказаться от столбца общего состояния и просто использовать его как вычисленный

 CREATE VIEW dbo.tbl1WithStatus 
AS
BEGIN

    SELECT *,  -- don't really use select *,  use column names
            CASE WHEN [Health Status] = 'Y' AND ([Risk Level] = 'No Risk' OR [Risk Level] = 'Not Applicable') THEN 'Pass and No Risk' 
                 WHEN ([Health Status] = 'U' OR [Health Status] = '') AND [Risk Level] 'High Risk' THEN 'Pass and No Risk' 
                 ...
                 END AS [Overall Status]
    FROM dbo.tbl1
                            
END
GO
  

Комментарии:

1. Спасибо! ваш работал лучше и проще, чем мой исходный код.

Ответ №2:

Вы определили параметры без значений по умолчанию. Итак, процедура ожидает параметры. Если вы не укажете значения для параметров, то будут приняты значения по умолчанию.

В приведенном ниже коде для параметров будут приняты значения по умолчанию.

 EXEC UpdateStatus
  

Кроме того, всегда определяйте процедуры с именем схемы. Кроме того, обработайте значения по умолчанию внутри процедуры. Если значения не передаются, то принимается значение по умолчанию. Если по умолчанию принимается значение NULL, обработайте его соответствующим образом в коде.

 ALTER PROCEDURE dbo.UpdateStatus
    @HealthStatus NVARCHAR (MAX) = NULL ,
    @Risk NVARCHAR (MAX) = NULL,
    @Job NVARCHAR(MAX) = NULL,
    @JobStatus NVARCHAR(MAX) = NULL   
BEGIN

IF @HealthStatus IS NULL 
BEGIN
SET @HealthStatus = (SELECT [Health Status] FROM [tbl1])
END 

IF @Risk IS NULL 
BEGIN
    SET @Risk = (SELECT [Risk Level] FROM [tbl1])
END 


IF @Job  IS NULL 
BEGIN
    SET @Job = (SELECT [Job] FROM [tbl1])
END 

IF @JobStatus IS NULL 
BEGIN
    SET @JobStatus = (SELECT [Detail status] FROM [tbl1])
END 

.
.
.