存储过程:使用条件更新列
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
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