SQL标量函数返回意外结果
我不明白为什么这两件事会产生不同的结果 此SQL返回字母p: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
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语句的第二列,而不是'P18292'
,但它正在转换为'P'
,因此与函数中的条件不匹配。Feeling有点傻,但我现在明白了。我关注的是返回值,但您指的是传递的参数。谢谢戈登!我是T-SQL新手,正在努力在紧迫的时间内完成学习过程。谢谢您的耐心。
ALTER FUNCTION [dbo].[PENDS_BAA_ParProvider](@ProviderNumber varchar(255))