Я реализую хранимую процедуру в SQL Server 2014 с двумя параметрами: @CLIENTID и @CONTRACTID. Один из параметров является необязательным, поэтому, когда хранимая процедура получает только идентификатор клиента, она должна возвращать всю информацию, относящуюся к этому клиенту, а когда она получает и идентификатор клиента, и идентификатор контракта, она должна возвращать только информацию, относящуюся к этому клиенту. конкретного контракта, от этого конкретного клиента.
Вот пример кода...
CREATE PROCEDURE SP_EXAMPLE_STACKOVERFLOW
@CLIENTID INT,
@CONTRACTID INT = NULL
AS
SELECT
*
FROM
Table T
WHERE
T.CLIENTID = @CLIENTID
AND (T.CONTRACTID = @CONTRACTID OR ISNULL(@CONTRACTID, 0) = 0)
Приведенный выше код работает, однако моей первой попыткой было сделать последнюю строку такой:
AND T.CONTRACTID = ISNULL(@CONTRACTID, T.CONTRACTID)
Однако это не сработало... В основном считалось, что эта последняя строка все время оценивается как FALSE.
Я не могу понять, почему... И я был бы признателен за помощь.
Примечание: вы должны нет использовать префикс sp_ для своих хранимых процедур. У Microsoft есть зарезервировал этот префикс для собственного использования (см. Именование хранимых процедур), и вы рискуете столкнуться с конфликтом имен в будущем. Это также плохо сказывается на производительности ваших хранимых процедур.. Лучше просто избегать sp_ и использовать что-то другое в качестве префикса или вообще не использовать префикс!


Я думаю, вы хотите:
SELECT T.*
FROM Table T
WHERE T.CLIENTID = @CLIENTID AND
(@CONTRACTID IS NULL OR T.CONTRACTID = @CONTRACTID)
Это вернет весь контракт для клиента, если @CONTRACTID равно NULL. Он вернет только указанный контракт, если это не так NULL.
Тот факт, что это не работает должным образом:
T.CONTRACTID = ISNULL(@CONTRACTID, T.CONTRACTID)
предполагает, что T.CONTRACTID может быть NULL. Это единственная ценность, которая не была бы равна самой себе.
Похоже, что T.CONTRACTID имеет значение NULL в вашем наборе данных. В этом случае ISNULL будет отбрасывать параметр NULL, но вместо этого использовать поле NULL. В SQL сравнение NULL = NULL будет действовать как FALSE (технически сравнение NULL = NULL даст NULL, который действует как FALSE, когда используется И с другими условиями).