2014-09-03 4 views
1

Я не могу понять, почему эти 2 вещи возвращают разные результаты.Скалярная функция 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 (ответ в основном связан с экспериментированием и изучением ng), мне интересно, почему функция создает строку с нулевой длиной.

EDIT Моя текущая функция теперь выглядит следующим образом, но все-таки возвращает ZLS, в отличие от P:.

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

ALTER FUNCTION [DBO] [PENDS_BAA_ParProvider] (@ProviderNumber VARCHAR)

ВОЗВРАТ VARCHAR (15) КАК НАЧАТЬ

Объявите @result VARCHAR (15)

набор @ результат = IsNull ((SELECT СЛУЧАЙ КОГДА PROVIDERPARSTATUS Is Null THEN ' КОГДА 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 ([email protected] AND CONTRACTS.TermDate=0)),'') 

Вернуться @result END GO

+2

Я не думаю, что верхний запрос возвращает P Я думаю, что он возвращает 6. –

+0

Ответ должен быть таким, что 'PROVIDERPARSTATUS' не равен' P' для 'ProviderNbr = 'P18292''. Что, если он равен другому персонажу, который только * выглядит * как P? – ErikE

+0

@DanBracuk Он означает второй столбец первого оператора SQL, а не результат «Лен». – ErikE

ответ

0

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

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)) 
+0

Спасибо - я начал «обнюхивать» в этом направлении, и именно поэтому я начал тестировать длину вещей (извините - это была опечатка, чтобы оставить Лен() там, когда я разместил вопрос, хотя). Но теперь я отредактировал его, чтобы вернуть varchar (15), но STILL не возвращает P. – Isaac

+0

Моя текущая функция - это, но она все равно возвращает строку с нулевой длиной: – Isaac

+0

Gordon: Хорошо, я изменил первую строку : ALTER FUNCTION [dbo]. [PENDS_BAA_ParProvider] (@ ProviderNumber varchar (15)) , и вы правы, теперь я получаю «P» назад.Но я больше смущен сейчас и задаю пару вопросов: 1) Почему не это линия RETURN, которая «имеет значение» в этом отношении? 2) Почему это имело значение в данном конкретном случае, поскольку P только один символ в любом случае? .. И спасибо – Isaac

Смежные вопросы