SQL标量函数返回意外结果

时间:2014-09-03 00:50:47

标签: 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
   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语句(答案主要与实验和学习有关),我想知道为什么函数会产生零长度的字符串。

修改 我现在的函数现在看起来像这样,但是STILL返回一个ZLS,而不是P:

当前功能 - STILL返回ZLS

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

RETURNS varchar(15) AS BEGIN

声明@result varchar(15)

设置@ result = isnull((SELECT                 案件                     当PROVIDERPARSTATUS为空时那么''                     当PROVIDERPARSTATUS ='P'那么'P'                 ELSE''结束

            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 结束 GO

1 个答案:

答案 0 :(得分: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))