SQL Server 2016-变量显示为NULL



我们的应用程序中有一个标量函数,如下

CREATE function dbo.SCMGetEnvProfileValueFn
(@HierarchyCode  varchar(255),    -- Usually the subsystem code
@Code  varchar(50),              -- The Code to find
@Default varchar(255)            -- If not found, return this default
)
RETURNS varchar(255)
AS
BEGIN
DECLARE @Value as varchar(255)
SELECT @Value = (SELECT TOP(1) Value FROM HVCEnvProfile
WHERE HierarchyCode = @HierarchyCode 
AND Code = @Code)
RETURN ISNULL (@Value, @Default)
END

我们将此函数转换为表函数

CREATE FUNCTION SCMGetEnvProfileValueTblFn
(@HierarchyCode  varchar(255),    -- Usually the subsystem code
@Code varchar(50),              -- The Code to find
@Default varchar(255)            -- If not found, return this default
)
RETURNS TABLE
AS
RETURN
(SELECT TOP(1) ISNULL (Value, @Default) AS value 
FROM HVCEnvProfile
WHERE HierarchyCode = @HierarchyCode AND Code = @Code)

下面两个语句显示了不同的输出。HVCEnvProfile表中没有此条目的列。为什么表中没有行时变量@Value显示为NULL。

SELECT value 
FROM dbo.SCMGetEnvProfileValueTblFn('Registration', 'AdmitDtmEffectsLocationHistory', 'TRUE')
SELECT dbo.SCMGetEnvProfileValueFn('Registration', 'AdmitDtmEffectsLocationHistory', 'TRUE')

如果查询不返回行,则不会返回任何行,包装ISNULL不会改变这一点。示例:

SELECT ISNULL(V.C,0)
FROM (VALUES(1),(2),(3),(4))V(C)
WHERE V.C = 5;

请注意,这不会返回0,但不会返回任何内容。

您需要将整个查询封装在ISNULL中。

CREATE FUNCTION SCMGetEnvProfileValueTblFn (@HierarchyCode varchar(255), -- Usually the subsystem code
@Code varchar(50),           -- The Code to find
@Default varchar(255)        -- If not found, return this default
)
RETURNS table
AS
RETURN
SELECT ISNULL((SELECT TOP (1) [Value]
FROM HVCEnvProfile
WHERE HierarchyCode = @HierarchyCode
AND Code = @Code
ORDER BY SomeColumn), @Default) AS [Value]; --Don' forgot to change the value of SomeColumn

也不要忘记,当使用TOP时,您需要ORDER BY,除非您是;快乐的";结果不一致(我对此表示怀疑(,所以我添加了一个您需要修改的结果。

最新更新