Я бы сначала добавил проверку, чтобы увидеть, все ли параметры были нулевыми во время выполнения, т.е.
IF(COALESCE(@userId, @noteType, @aCode, @bCode, @cCode) IS NULL)
BEGIN
-- do something here, log, print, return, etc.
END
Затем, после того, как вы подтвердите, что пользователь передал что-то в вас, вы можете использовать что-то подобное в предложении WHERE
WHERE userId = COALESCE(@userId, userId)
AND noteType = COALESCE(@noteType, noteType)
AND aCode = COALESCE(@aCode, aCode)
AND bCode = COALESCE(@bCode, bCode)
AND cCode = COALESCE(@cCode, cCode)
РЕДАКТИРОВАТЬ: Возможно, я пропустил намерение, что если параметр был передан как NULL, это означает, что вы явно хотите проверить столбец на NULL. В предложении выше, где предполагается, что нулевой параметр означает «пропустить тест по этому столбцу».
В качестве альтернативы я полагаю, что вы можете использовать исходный запрос и добавить опцию установки ANSI_NULLS во время создания хранимой процедуры. Например,
SET ANSI_NULLS OFF
GO
CREATE PROC sp_myDuplicateCheck....
По сути, это должно позволить вашему коду оценить значение column = null, а значение column = null. Я думаю, что Кален Делани однажды придумал опции ANSI _NULLS и QUOTED_IDENTIFIER как «липкие опции», потому что если они установлены во время создания процедуры, они остаются с процедурой во время выполнения, независимо от того, как соединение в это время установлено.