SQL Server: логика поведения необязательных параметров - PullRequest
0 голосов
/ 06 июля 2019

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

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

1 Ответ

2 голосов
/ 06 июля 2019

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

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.Это единственное значение, которое не будет равным самому себе.

...