2012-03-28 4 views
1
CREATE FUNCTION [dbo].[MSG_FilterAutoship] 
(
    @ItemID VARCHAR(50) = NULL 
) 
RETURNS 
@Autoship TABLE 
(
    DistID INT, 
    BusCtrID INT 
) 
AS 
BEGIN 
    INSERT INTO @Autoship (DistID, BusCtrID) 
     SELECT [as].Distid, 1 as busctrid 
     FROM Autoship [as] 
     INNER JOIN AutoshipDetail ad ON [as].DistID = ad.DistID 
     INNER JOIN AS_DistributorCreditCard acc ON [as].DistID = acc.DistID 
     WHERE [ad].InventoryID IN (@ItemID) 
    RETURN 
END 

Что мне нужно, если @ItemID передано в нулевом значении, то WHERE [ad].InventoryID IN (@ItemID) в основном не будет фильтровать результаты вообще. Это возможно?Проблема SQL с функцией

Так что, если я пройду через 120, 520, он будет фильтровать результаты, поэтому будут показаны только те два элемента. Если я пройду через NULL, тогда он отобразит все элементы.

Сплит функция:

ALTER FUNCTION [dbo].[Split] 
(
    @Delimiter CHAR, 
    @Text TEXT 
) 
RETURNS @Result TABLE (RowID SMALLINT IDENTITY(1, 1) PRIMARY KEY, Data VARCHAR(MAX)) 
AS 

BEGIN 
    DECLARE @NextPos INT, 
     @LastPos INT 

    SELECT @NextPos = CHARINDEX(@Delimiter, @Text, 1), 
     @LastPos = 0 

    WHILE @NextPos > 0 
     BEGIN 
      INSERT @Result 
       (
        Data 
       ) 
      SELECT SUBSTRING(@Text, @LastPos + 1, @NextPos - @LastPos - 1) 

      SELECT @LastPos = @NextPos, 
       @NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1) 
     END 

    IF @NextPos <= @LastPos 
     INSERT @Result 
      (
       Data 
      ) 
     SELECT SUBSTRING(@Text, @LastPos + 1, DATALENGTH(@Text) - @LastPos) 

    RETURN 
END 

Вот обновленный запрос, который использует функцию разделения:

AS 
BEGIN 
    INSERT INTO @Autoship (DistID, BusCtrID) 
     SELECT [as].Distid, 1 as busctrid 
     FROM Autoship [as] 
     INNER JOIN AutoshipDetail ad ON [as].DistID = ad.DistID 
     INNER JOIN AS_DistributorCreditCard acc ON [as].DistID = acc.DistID 
     WHERE [ad].InventoryID IN (SELECT Data from dbo.Split(',', @ItemID)) or @ItemID IS NULL 
    RETURN 
END 

ответ

2

Несомненно. WHERE InventoryID = @ItemID OR @ItemID IS NULL. Обратите внимание, что TSQL не будет автоматически расширять «1, 2, 3» до «IN (1, 2, 3)», скорее сравнивает InventoryID с «1, 2, 3» и, по-видимому, не будет иметь совпадений.

+0

это работает, насколько я могу судить, но я не понимаю, как это работает. У меня есть функция split, если они передаются в 1,2,3,4,5 и т. Д., Что позволяет работать, если они помещают более одного элемента. –

+0

Что неясно? –

+0

Ну, он читал бы как это WHERE InventoryID IN (NULL) ИЛИ '@ItemID' NULL. Как он обходит место в NULL, а «@ItemID» - NULL. Выключено ли предложение IN, а так как утверждение or истинно, оно обрабатывает sql? Я благодарен за это, просто хочу, чтобы я понял, почему он работал лучше. –

0

Это будет возвращать все строки, если NULL передается еще возвращать только те записи, которые находятся в Itemid

CREATE FUNCTION [dbo].[MSG_FilterAutoship] 
(
    @ItemID VARCHAR(50) = NULL 
) 
RETURNS 
@Autoship TABLE 
(
    DistID INT, 
    BusCtrID INT 
) 
AS 
BEGIN 
    INSERT INTO @Autoship (DistID, BusCtrID) 
     SELECT [as].Distid, 1 as busctrid 
     FROM Autoship [as] 
     INNER JOIN AutoshipDetail ad ON [as].DistID = ad.DistID 
     INNER JOIN AS_DistributorCreditCard acc ON [as].DistID = acc.DistID 
     WHERE [ad].InventoryID IN (@ItemID) or [ad].InventoryID IS NULL 
    RETURN 
END 
1

Да, просто добавьте его в ИНЕКЕ:

WHERE @ItemID IS NULL OR [ad].InventoryID IN (@ItemID) 
Смежные вопросы