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
除非你对不一致的结果感到“满意”(我对此表示怀疑),所以我添加了一个你需要修改。
我们的应用程序中有一个标量函数,如下所示
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.
中没有行时显示 NULLSELECT 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
除非你对不一致的结果感到“满意”(我对此表示怀疑),所以我添加了一个你需要修改。