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)
в основном не фильтрует результаты вообще.Возможно ли это?
Таким образом, в основном, если я передам 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