Проблема SQL с функцией - PullRequest
1 голос
/ 28 марта 2012
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

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

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

1 голос
/ 28 марта 2012

Да, просто добавьте его к предложению Where:

WHERE @ItemID IS NULL OR [ad].InventoryID IN (@ItemID)
0 голосов
/ 28 марта 2012

Это вернет все строки, если передан 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...