2012-03-28 90 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

以此爲據我所知道的工作,但我不明白它是如何工作的。如果他們通過1,2,3,4,5等,我有一個分裂的功能,如果他們放入多個itemid,它可以工作。 – 2012-03-28 17:11:25

+0

什麼不清楚? – 2012-03-28 17:17:26

+0

那麼,它會讀爲WHERE InventoryID IN(NULL)或'@ItemID'爲NULL。它如何繞過NULL中的where和'@ItemID'爲NULL。 IN子句是否出錯,並且由於or語句爲true,它會處理sql?我很感激它的作品,只是希望我明白爲什麼它效果更好。 – 2012-03-28 17:22:41

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子句:

WHERE @ItemID IS NULL OR [ad].InventoryID IN (@ItemID)