SQL Server: логика поведения необязательных параметров

Я реализую хранимую процедуру в 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.

Я не могу понять, почему... И я был бы признателен за помощь.

Похоже, что T.CONTRACTID имеет значение NULL в вашем наборе данных. В этом случае ISNULL будет отбрасывать параметр NULL, но вместо этого использовать поле NULL. В SQL сравнение NULL = NULL будет действовать как FALSE (технически сравнение NULL = NULL даст NULL, который действует как FALSE, когда используется И с другими условиями).

Jordan Rieger 06.07.2019 01:29

Примечание: вы должны нет использовать префикс sp_ для своих хранимых процедур. У Microsoft есть зарезервировал этот префикс для собственного использования (см. Именование хранимых процедур), и вы рискуете столкнуться с конфликтом имен в будущем. Это также плохо сказывается на производительности ваших хранимых процедур.. Лучше просто избегать sp_ и использовать что-то другое в качестве префикса или вообще не использовать префикс!

marc_s 06.07.2019 06:16
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы хотите:

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. Это единственная ценность, которая не была бы равна самой себе.

Другие вопросы по теме