【问题标题】:Stored Procedure: Update column with conditional condition存储过程:使用条件条件更新列
【发布时间】:2020-08-26 03:52:40
【问题描述】:
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 Server 中执行该过程。但是,我遇到了:

过程或函数“UpdateStatus”需要参数“@HealthStatus”,但未提供。

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

我只在sql server里面写了调用代码

EXEC UpdateStatus

【问题讨论】:

  • 你需要向我们展示调用代码,这就是错误所在。
  • 除非有默认值,否则需要传入参数!

标签: sql sql-server stored-procedures


【解决方案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

【讨论】:

  • 谢谢!你的比我的原始代码工作得最好,也更简单。
【解决方案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 

.
.
.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多