У меня есть хранимая процедура с 6 параметрами, и я хотел бы выполнить ее, даже если некоторые параметры являются нулевыми. Вот что у меня есть:
CREATE OR ALTER PROCEDURE [dbo].[report]
(@StartDate DATETIME,
@EndDate DATETIME,
@Mode VARCHAR(50) = '', -- { SS105 | SS106 }
@DEBUG BIT = 0,
@Age FLOAT = NULL, -- { Greater than 59 or less )
@EmpStatus VARCHAR(255) = NULL) -- { 'Employed' OR 'Unemployed }
AS
BEGIN
IF @Mode = 'SS106'
BEGIN
DECLARE @SS106 TABLE
(
[ClientID] INT
, [ClientName] VARCHAR(255)
, [VService] VARCHAR(10)
, [Age] FLOAT
, [EmploymentStatus] VARCHAR(255)
);
INSERT INTO @SS106
(
[ClientID]
, [ClientName]
, [VService]
, [Age]
, [EmploymentStatus]
)
SELECT DISTINCT
[ClientID] = [c].[ClientID]
, [ClientName] = [c].[ClientName]
, [VService] = [c].[VService]
, [Age] = [c].[Age]
, [EmploymentStatus] = [c].[EmploymentStatus]
FROM [#Table] AS [c] WITH (NOLOCK)
WHERE
( @Age IS NULL OR [c].[Age] >= @Age )
AND
( @EmpStatus IS NULL OR ( @EmpStatus = 'Employed' AND [c].[EmploymentStatus] IN
('Employed Part Time (<35 hrs per week)', 'Employed Full Time (35+ hrs per week)')
)
OR
@EmpStatus IS NULL OR ( @EmpStatus = 'Unemployed' AND [c].[EmploymentStatus] NOT IN
('Employed Part Time (<35 hrs per week)', 'Employed Full Time (35+ hrs per week)')
)
)
AND [c].[VService] IN ('SS106')
IF @DEBUG = 1
BEGIN
SELECT * FROM @SS106
END
RETURN 0
END
Так что я знаю, когда выполнять хранимую процедуру, вы бы просто вызвали вызов выполнения.
[dbo].[report] '1/1/2019' , '1/4/2019' , 'SS106' , '1' , '58' , 'Employed'
Я бы хотел хранимую процедуру выполнить, когда последние 2 параметра пусты, и отобразить таблицу. Это работает, когда я устанавливаю @Age
и @EmpStatus
на желаемое значение. Однако это не удается, когда я оставляю @EmpStatus
как NULL, а остальные со значением. Вероятно, это проблема с круглыми скобками, но есть ли эффективный способ сделать это.
Я знаю, что это много, но я застрял здесь на 2 часа. Это мое последнее средство.