我无法弄清楚为什么这两件事会产生不同的结果。
此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
答案 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))