SQL标量函数返回意外结果

SQL标量函数返回意外结果,sql,function,scalar,Sql,Function,Scalar,我不明白为什么这两件事会产生不同的结果 此SQL返回字母p: SELECT PROVIDERS.PROVIDERNBR, CONTRACTS.PROVIDERPARSTATUS FROM dwpresentation_prod.dbo.PROVIDERS INNER JOIN dwpresentation_prod.dbo.CONTRACTS ON PROVIDERS.PROVIDERNBR = CONTRACTS.PROVIDERNBR WHERE PROVIDE

我不明白为什么这两件事会产生不同的结果

此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:

当前函数-仍然返回ZLS

ALTER函数[dbo].[PENDS_BAA_ParProvider](@ProviderNumber varchar)

返回varchar(15) 作为开始

声明@result varchar(15)

设置@result=isnull((选择 案例 当PROVIDERPARSTATUS为空时,则“” 当PROVIDERPARSTATUS='P'然后'P' “否则”结束

返回@result 终止
转到

您的问题在函数定义中。这是:

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

我不认为顶级查询返回P。我认为它返回6。答案必须是
PROVIDERPARSTATUS
对于
ProviderNbr='P18292'
,它不等于
P
。如果它等于另一个看起来只像P的字符呢?@DanBracuk他指的是第一条SQL语句的第二列,而不是的结果ode>Len。谢谢你-我开始朝那个方向“嗅探”,这就是为什么我开始测试东西的长度(抱歉-当我发布问题时,把Len()留在那里是一个打字错误)。但现在我编辑它以返回varchar(15),但它仍然不返回P。我当前的函数是这个,但它仍然返回一个零长度字符串:戈登:好的,我把第一行改为:ALTER function[dbo]。[PENDS_BAA_ParProvider](@ProviderNumber varchar(15)),你是对的,现在我得到了“P”。但我现在更困惑了,有几个问题:1)为什么在这方面“重要”的不是回程线既然P只是一个字符,为什么在这个特殊的情况下它会很重要呢you@Isaac…问题是传入一个字符而不是字符串。您认为传入的是
'P18292'
,但它正在转换为
'P'
,因此与函数中的条件不匹配。Feeling有点傻,但我现在明白了。我关注的是返回值,但您指的是传递的参数。谢谢戈登!我是T-SQL新手,正在努力在紧迫的时间内完成学习过程。谢谢您的耐心。
ALTER FUNCTION [dbo].[PENDS_BAA_ParProvider](@ProviderNumber varchar(255))