Скалярная функция SQL возвращает неожиданный результат

Я не могу понять, почему эти две вещи дают разные результаты.

Этот SQL возвращает букву P:

SELECT PROVIDERS.PROVIDERNBR, CONTRACTS.PROVIDERPARSTATUS
FROM
   dwpresentation_prod.dbo.PROVIDERS
   INNER JOIN dwpresentation_prod.dbo.CONTRACTS
      ON PROVIDERS.PROVIDERNBR = CONTRACTS.PROVIDERNBR
WHERE
   PROVIDERS.PROVIDERNBR = 'P18292'
   AND CONTRACTS.TERMDATE = 0;

Но это возвращает строку нулевой длины:

SELECT dbo.PENDS_BAA_ParProvider('P18292');

Вот функция:

ALTER FUNCTION [dbo].[PENDS_BAA_ParProvider](@ProviderNumber varchar)
RETURNS varchar(15)
AS
BEGIN
   DECLARE @result varchar (15);
   SET @result = IsNull((
      SELECT
         CASE 
         WHEN PROVIDERPARSTATUS IS NULL THEN ''
         WHEN PROVIDERPARSTATUS = 'P' THEN 'P'
         ELSE '' END
      FROM
         dwpresentation_prod.dbo.Providers PROVIDERS
         INNER JOIN dwPresentation_Prod.dbo.Contracts CONTRACTS
            ON PROVIDERS.ProviderNbr = CONTRACTS.ProviderNbr
      WHERE
         PROVIDERS.ProviderNbr = @ProviderNumber
         AND CONTRACTS.TermDate = 0
   ), '');

   RETURN @result;
END;

Без монологов о том, почему я использую функцию, а не оператор SQL (ответ в основном связан с экспериментированием и обучением), мне интересно, ПОЧЕМУ функция создает строку нулевой длины.

ИЗМЕНИТЬ Моя текущая функция теперь выглядит так, но ВСЕ ЕЩЕ возвращает ZLS, а не P:

Текущая функция - STILL возвращает ZLS

ALTER FUNCTION [dbo]. [PENDS_BAA_ParProvider] (@ ProviderNumber varchar)

ВОЗВРАЩАЕТ varchar (15) В НАЧАЛЕ

Объявить @result varchar (15)

set @ result = isnull ((SELECT CASE WHEN PROVIDERPARSTATUS is Null THEN '' WHEN PROVIDERPARSTATUS = 'P' THEN 'P' ELSE '' END

            FROM dwpresentation_prod.dbo.Providers PROVIDERS
                INNER JOIN dwPresentation_Prod.dbo.Contracts CONTRACTS
            ON PROVIDERS.ProviderNbr = CONTRACTS.ProviderNbr

            WHERE (PROVIDERS.ProviderNbr=@ProviderNumber AND CONTRACTS.TermDate=0)),'')

Возврат @result END GO


person Isaac    schedule 03.09.2014    source источник
comment
Я не думаю, что верхний запрос возвращает P. Я думаю, что он возвращает 6.   -  person Dan Bracuk    schedule 03.09.2014
comment
Ответ должен заключаться в том, что PROVIDERPARSTATUS не равно P для ProviderNbr = 'P18292'. Что, если он равен другому символу, который только выглядит как P?   -  person ErikE    schedule 03.09.2014
comment
@DanBracuk Он имеет в виду второй столбец первого оператора SQL, а не результат Len.   -  person ErikE    schedule 03.09.2014


Ответы (1)


Ваша проблема в определении функции. Этот:

ALTER FUNCTION [dbo].[PENDS_BAA_ParProvider](@ProviderNumber varchar)

эквивалентно:

ALTER FUNCTION [dbo].[PENDS_BAA_ParProvider](@ProviderNumber varchar(1))

В SQL Server всегда включайте длину с типами символов:

ALTER FUNCTION [dbo].[PENDS_BAA_ParProvider](@ProviderNumber varchar(255))
person Gordon Linoff    schedule 03.09.2014
comment
Спасибо - я начал нюхать в этом направлении, и поэтому я начал тестировать Lengths of things (извините, но оставить Len () там, когда я разместил вопрос, было опечаткой). Но теперь я отредактировал его, чтобы вернуть varchar (15), но он ВСЕ ЕЩЕ не возвращает P. - person Isaac; 03.09.2014
comment
Моя текущая функция такова, но она по-прежнему возвращает строку нулевой длины: - person Isaac; 03.09.2014
comment
Гордон: Хорошо, я изменил первую строку на: ALTER FUNCTION [dbo]. [PENDS_BAA_ParProvider] (@ ProviderNumber varchar (15)), и вы правы, теперь я получаю "P" обратно. Но сейчас я запутался больше, и у меня есть пара вопросов: 1) Почему в этом отношении «имеет значение» не строка RETURN? 2) Почему это имело значение в данном конкретном случае, если P в любом случае является только одним символом? ..И спасибо - person Isaac; 03.09.2014
comment
@ Исаак. . . Проблема заключается в передаче одного символа, а не строки. Вы думаете, что передаете 'P18292', но он конвертируется в 'P' и, следовательно, не соответствует условиям, которые у вас есть в функции. - person Gordon Linoff; 03.09.2014
comment
Немного глупо, но теперь я понимаю. Я сосредоточился на возврате, но вы имели в виду переданный параметр. Спасибо, Гордон! Я новичок в T-SQL и пытаюсь научиться в сжатые сроки. Спасибо за терпение. - person Isaac; 03.09.2014