润乾报表v5调用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  也可以。

猜你喜欢

转载自blog.csdn.net/cainiao_M/article/details/79240556