SQL Server 2016 - 变量显示 NULL

SQL Server 2016 - Variable showing 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

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

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)

以下 2 个语句显示不同的输出。 table HVCEnvProfile 中没有此条目的列。为什么变量@Value 在 table.

中没有行时显示 NULL
SELECT value 
FROM dbo.SCMGetEnvProfileValueTblFn('Registration', 'AdmitDtmEffectsLocationHistory', 'TRUE')

SELECT dbo.SCMGetEnvProfileValueFn('Registration', 'AdmitDtmEffectsLocationHistory', 'TRUE')

如果查询 return 没有行,则不会 return 编辑任何行,包装 ISNULL 不会改变这一点。示例:

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

注意这不是return0,但什么也没有。

您需要将整个查询包装在 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 除非你对不一致的结果感到“满意”(我对此表示怀疑),所以我添加了一个你需要修改。