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
以此爲據我所知道的工作,但我不明白它是如何工作的。如果他們通過1,2,3,4,5等,我有一個分裂的功能,如果他們放入多個itemid,它可以工作。 – 2012-03-28 17:11:25
什麼不清楚? – 2012-03-28 17:17:26
那麼,它會讀爲WHERE InventoryID IN(NULL)或'@ItemID'爲NULL。它如何繞過NULL中的where和'@ItemID'爲NULL。 IN子句是否出錯,並且由於or語句爲true,它會處理sql?我很感激它的作品,只是希望我明白爲什麼它效果更好。 – 2012-03-28 17:22:41