2014-09-03 71 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),我想知道爲什麼函數產生一個零長度的字符串。

編輯 我現在的功能現在看起來是這樣,但仍然會返回一個ZLS,而不是爲P:

電流功能 - 仍然返回ZLS

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

返回值VARCHAR(15) AS BEGIN

申報@result VARCHAR(15)

組@結果= ISNULL((SELECT CASE WHEN PROVIDERPARSTATUS爲NULL,則 '' 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 ([email protected] AND CONTRACTS.TermDate=0)),'') 

返回@Result END GO

+2

我不認爲上查詢返回p 。我認爲它返回6. – 2014-09-03 00:54:17

+0

答案必須是'PROVIDERPARSTATUS'對於'ProviderNbr ='P18292''不等於'P'。如果它等於另一個只看起來像P的角色呢? – ErikE 2014-09-03 01:01:22

+0

@DanBracuk他意味着第一個SQL語句的第二列,而不是'Len'的結果。 – ErikE 2014-09-03 01:02:30

回答

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),但它仍然沒有返回P. – Isaac 2014-09-03 03:26:54

+0

我現在的功能是這樣的,但它仍然會返回一個零長度字符串: – Isaac 2014-09-03 03:28:29

+0

戈登:好吧,我改的第一行是: ALTER FUNCTION [DBO] [PENDS_BAA_ParProvider](@ ProviderNumber VARCHAR(15)) ,你是對的,現在我得到 'P' 回來。但我現在更加困惑,並且有幾個問題: 1)爲什麼它不是那個'重要'在這方面的返回線? 2)爲什麼它在這種特殊情況下是重要的,因爲P是唯一的一個字符呢? ..並且非常感謝 – Isaac 2014-09-03 03:32:07