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
это работает, насколько я могу судить, но я не понимаю, как это работает. У меня есть функция split, если они передаются в 1,2,3,4,5 и т. Д., Что позволяет работать, если они помещают более одного элемента. –
Что неясно? –
Ну, он читал бы как это WHERE InventoryID IN (NULL) ИЛИ '@ItemID' NULL. Как он обходит место в NULL, а «@ItemID» - NULL. Выключено ли предложение IN, а так как утверждение or истинно, оно обрабатывает sql? Я благодарен за это, просто хочу, чтобы я понял, почему он работал лучше. –