我们的应用程序中有一个标量函数,如下
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
,除非您是;快乐的";结果不一致(我对此表示怀疑(,所以我添加了一个您需要修改的结果。