Хранимая процедура не возвращает все записи при передаче нескольких значений параметрам

Я знаю, что эта тема обсуждалась здесь много раз. Но я потратил 2 дня и все еще не мог выяснить проблему с моим кодом. Любая помощь будет принята с благодарностью.

У меня есть хранимая процедура, которая ожидает 6 параметров, и я передаю несколько значений для них. Хранимая процедура возвращает правильные записи, когда выбрано одно значение.

Пожалуйста, найдите код хранимой процедуры, и я использую udf [ufnsplit], который используется для разделения переданных значений в таблицах

CREATE PROCEDURE [dbo].[Test1]
    @BUClass AS NVARCHAR(MAX),
    @Office AS NVARCHAR(MAX),
    @writer AS NVARCHAR(MAX),        
    @From AS DATETIME,
    @To AS DATETIME,
AS 
BEGIN
    SET NOCOUNT ON
    SET ANSI_WARNINGS ON

   ;WITH UWS AS 
   (
       SELECT
           [Prefix],
           BusinessUnit,
           Office,
           Writer,
           FormName,
           Company
       FROM 
           A
       WHERE    
           BUClass IN (SELECT item FROM dbo.ufnSplit(@BUClass, ','))
           AND Office IN (SELECT item FROM [dbo].[ufnSplit](@Office, ','))
           AND Writer IN (SELECT item FROM [dbo].[ufnSplit](@writer, ','))
           AND Expiry_DT >= @From
           AND Expiry_DT <= @To
    ) 
    SELECT * 
    FROM UWS
END

Я использую функцию

CREATE FUNCTION [dbo].[ufnSplit]
    (@RepParam NVARCHAR(MAX), @Delim CHAR(1)= ',')
RETURNS @Values TABLE (Item NVARCHAR(100))
AS
BEGIN
    DECLARE @chrind INT
    DECLARE @Piece NVARCHAR(100)

    SELECT @chrind = 1 

    WHILE @chrind > 0
    BEGIN
        SELECT @chrind = CHARINDEX(@Delim, @RepParam)

        IF @chrind  > 0
            SELECT @Piece = LEFT(@RepParam, @chrind - 1)
        ELSE
            SELECT @Piece = @RepParam

        INSERT INTO @Values(Item) VALUES(@Piece)

        SELECT @RepParam = RIGHT(@RepParam, LEN(@RepParam) - @chrind)

        IF LEN(@RepParam) = 0 
            BREAK
    END

    RETURN
END

Когда я передаю несколько значений, возвращается 0 записей или первое значение, переданное в параметр. Я передаю такие значения, как

DECLARE @return_value int

EXEC    @return_value = [dbo].[Test1]
                @Office = N'ATLANTA, 
                            BERKELEY HEIGHTS, 
                            BOSTON, 
                            CHICAGO, 
                            CLEVELAND',
                @BusinessClass = N'Commercial Management Solutions,
                                   HEALTHCARE, 
                                   PROGRAMS - PROFESSIONAL, 
                                   CANADA',
                @writer = N'Grant Duggar, 
                            Alyssa Gulich, 
                            Amanda Kelly,   
                            Daniel Chavenson, 
                            Deborah Wilieko, 
                            Derek Barbe'
                @From = N'1/1/2018',
                @To = N'4/1/2018',

Я выполнил простой запрос к базе данных, просто чтобы проверить, есть ли данные для этих критериев. Я получаю данные обратно

SELECT DISTINCT * 
FROM A
WHERE BUclass IN (SELECT DISTINCT BUClass FROM A)
  AND Office IN (SELECT DISTINCT Producing_Office FROM A)
  AND UWName IN (SELECT DISTINCT UWName FROM A)
  AND Expiry_DT = '1/1/2018' 
  AND Expiry_DT <= '4/1/2018' 

Может кто-нибудь сказать, что я делаю не так? Я потратил на это много часов, но все равно не повезло.

Спасибо!

Простите за длинный пост.

1 ответ

Что вы должны сделать, это избавиться от новых строк в ваших параметрах, потому что:

@BusinessClass = N'Commercial Management Solutions,
                                   HEALTHCARE, 
                                   PROGRAMS - PROFESSIONAL, 
                                   CANADA'

это не то же самое, что

@BusinessClass = N'Commercial Management Solutions,HEALTHCARE,PROGRAMS - PROFESSIONAL,CANADA'

и вы говорите своей функции, что единственным разделителем является запятая (,) это не так, это запятая и новая строка для первого фрагмента кода, который по существу будет , + CHAR(13) + CHAR(10), это CHAR(13) + CHAR(10) на самом деле означает новую строку. Для того, чтобы прочитать немного больше на эту тему, я бы направил вас к этой маленькой статье. Объясняет проблему напрямую, и это работает в обоих направлениях (когда вы "ищете" что-то вроде вас или когда вы хотите добавить новые строки в (n)varchar).

Другие вопросы по тегам