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