存储过程:使用条件更新列

Stored Procedure: Update column with conditional condition

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

我编写了一个存储过程来根据同一 table 中其他列的输入更新总体状态,我将在 SQL 服务器中执行该过程。然而,我遇到了:

Procedure or function 'UpdateStatus' expects parameter '@HealthStatus', which was not supplied.

我已使用 SELECT 函数将值分配给参数。我是存储过程的新手,我不确定我哪里做错了。

我只在sql服务器

中写了调用代码
EXEC UpdateStatus

您定义的参数没有默认值。因此,该过程需要参数。如果您不指定参数值,则将采用默认值。

在下面的代码中,参数将采用默认值。

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 

.
.
.

如果您不打算使用参数,那么您似乎根本不需要参数。 您已经创建了变量。参数用于在执行期间传入值

Exec dbo.SomeProc @param1 = 'testvalue'

此外,您的过程依赖于只有 1 行的 tbl1。

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

如果 table 超过 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

您甚至可以放弃 Overall Status 列,只计算它

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