Проблема с хранимой процедурой SQL Примечание. Возвращаются значения при передаче NULLS

У меня есть хранимая процедура, которую я создал, и иногда есть параметры, которые передают значение NULL. Я настроил хранимую процедуру, чтобы принять это во внимание, но каждый раз, когда я передаю значение NULL, она ничего не возвращает, даже если переданы некоторые другие параметры. Не могли бы вы помочь? Вот моя хранимая процедура. Я не уверен, что это неправильное соединение или что.

Спасибо.

   @ProductID int = NULL,
   @CollectionID int = NULL,
   @ApplicationID int = NULL,
   @StyleID int = NULL
AS
   SELECT        
      dbo.CrossoverDesignTable.ColorNum, dbo.CrossoverDesignTable.CrossoverID,     
      dbo.ImagesWebsite.Description, 
      dbo.DesignNameTable.DesignDescription + ' ' +  dbo.CrossoverDesignTable.ColorNum AS DesignColor, 
      dbo.CollectionTable.CollectionDescription
   FROM            
      dbo.CrossoverDesignTable 
   INNER JOIN
      dbo.DesignNameTable ON dbo.CrossoverDesignTable.DesignNameID = dbo.DesignNameTable.DesignNameID 
   INNER JOIN
      dbo.ImagesWebsite ON dbo.CrossoverDesignTable.ProductImageID = dbo.ImagesWebsite.ProductImageID 
   INNER JOIN
      dbo.CollectionTable ON dbo.CrossoverDesignTable.CollectionID = dbo.CollectionTable.CollectionID
   WHERE        
      (dbo.CrossoverDesignTable.ProductID = @ProductID OR @ProductID IS NULL) 
      AND (dbo.CrossoverDesignTable.CollectionID = @CollectionID OR dbo.CrossoverDesignTable.CollectionID IS NULL) 
      AND (dbo.CrossoverDesignTable.ApplicationID = @ApplicationID OR @ApplicationID IS NULL) 
      AND (dbo.CrossoverDesignTable.ShowOnWeb = 'Yes') 
      AND (dbo.CrossoverDesignTable.StyleID = @StyleID OR @StyleID IS NULL) 

   RETURN

person user3605281    schedule 05.05.2014    source источник


Ответы (2)


Что я делаю в этих сценариях, так это меняю значение по умолчанию для @ProductId на -1.

НЕ ОТПРАВЛЯЙТЕ НИКАКОЕ ЗНАЧЕНИЕ ДЛЯ ПАРАМЕТРА, ЕСЛИ ВЫ ОТПРАВИТЕ NULL, ТОГДА ОН БУДЕТ ИСПОЛЬЗОВАТЬ ЭТО ЗНАЧЕНИЕ. ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ИСПОЛЬЗУЮТСЯ ТОЛЬКО ЕСЛИ ПАРАМЕТР НЕ ПЕРЕДАЕТСЯ.

@ProductID int = -1,
@CollectionID int = NULL,
@ApplicationID int = NULL,
@StyleID int = NULL

WHERE (@ProductID = -1 OR dbo.CrossoverDesignTable.ProductID = @ProductID)
  AND .....
person T McKeown    schedule 05.05.2014

Предполагая, что -1 - это значение, которого у вас нет, я рекомендую вам использовать это:

ISNULL(dbo.CrossoverDesignTable.ProductID, -1) = ISNULL(@ProductID, -1)

вместо:

dbo.CrossoverDesignTable.ProductID = @ProductID OR @ProductID IS NULL

и сделайте другие сравнения таким же образом.

Если вы хотите сохранить свой подход, вы должны сделать это таким образом, я думаю.

( (@ProductID is null) AND (dbo.CrossoverDesignTable.ProductID is null) )  
OR (dbo.CrossoverDesignTable.ProductID = @ProductID)
person peter.petrov    schedule 05.05.2014
comment
Можете ли вы объяснить, почему это лучше? - person thursdaysgeek; 05.05.2014
comment
Итак, добавьте это к каждому параметру, который может содержать нулевое значение, или только к первому? Обычно ProductID всегда будет иметь значение, но теперь другие параметры могут содержать что угодно. - person user3605281; 05.05.2014
comment
это не позволяет ему запрашивать какой-либо продукт. Причина NULL для @ProductID, вероятно, заключается в том, чтобы разрешить любой продукт - person T McKeown; 05.05.2014
comment
Хорошо, добавьте его там, где это уместно (например, для каждого параметра). ISNULL просто преобразует NULL в некоторое реальное значение, и тогда сравнение становится проще. - person peter.petrov; 05.05.2014
comment
@TMcKeown А, хорошая мысль. Но если так, то его способ сравнения вполне подойдет. - person peter.petrov; 05.05.2014
comment
я думаю, что есть другие части запроса, которые мешают данным - person T McKeown; 05.05.2014