#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
.
.
.