润乾报表调 sqlserver 存储过程数据集接收报表参数为空值的判断注意事项

问题:同一个过程,同输入条件下,数据库端执行结果和报表数据集执行结果不一致。
          过程为模拟的,如下:
CREATE PROCEDURE [dbo].[BST_BOM_FV1]
@FBOMNOMBER VARCHAR(80),
@FNOMBER VARCHAR(80)
AS  
BEGIN  
IF OBJECT_ID(‘tempdb..#t01’) is not null  
drop table #t01
-- if @FNOMBER is null
–  SET @FNOMBER='';
DECLARE @Temp_K3BOM1 TABLE  
    (FLevel INT,FNODE VARCHAR(50),FNAME VARCHAR(50),FMATERIALID INT);

INSERT  INTO @Temp_K3BOM1 values(1, ‘testProc1’, ‘01’, 2)
INSERT  INTO @Temp_K3BOM1 values(2, ‘testProc2’, ‘02’, 5)
INSERT  INTO @Temp_K3BOM1 values(3, ‘testProc3’, ‘003’, 6)
-- INSERT  INTO [dbo].[TTTT] values(@FNOMBER)
-- @FNOMBEr is null or
IF LEN(@fNOMBER)<1
INSERT  INTO @Temp_K3BOM1 values(4, ‘testProc4’, ‘04’, 4)

SELECT   
FLEVEL 层级,FNODE 节点,FNAME F 名字,FMATERIALID
INTO #t01   
FROM @TEMP_K3BOM1
where  FNAME=@FBOMNOMBER
ORDER BY FLevel  
SELECT * FROM #t01 WHERE 1=1 –AND 层级 <=1  
END  

当 fnumber 为空值的时候, FBOMNOMBER 值传入“04”,即返回临时表中 fname 为 04 的记录。 但这个 04 记录,是根据 fnumber 为空才会被 insert 到数据库的。 但是当报表执行过程,且传入 fnumber 为空值时  却没有查询到 04 这条记录。

问题解决:  经过排查,脚本中 IF LEN(@fNOMBER)<1     INSERT  INTO @Temp_K3BOM1 values(4, ‘testProc4’, ‘04’, 4)    此处的判断条件没有起作用(主要是用 len 的问题,不同数据库对 len(null) 的结果不同,一般应为 0,但 sqlserver 明显不是),所以即便报表给的是空值  也没有执行 04 的 insert 动作,结果就与数据库客户端执行不一致了。
解决方法: 上面脚本中,可以增加标红的部分, 先判断 如果 is mull  转为 ‘’空串。   或者 判断里 加 or 参数 is null  也可以。