如果第一个查询未返回任何结果,Crystal Reports不会执行所有数据库查询

时间:2015-03-10 05:50:33

标签: sql-server crystal-reports

我有一个Crystal Report(使用CR 2008),它有三个数据库查询(以下内容来自" Show SQL"菜单选项)

MYSERVER
"mydb"."dbo"."run_report";1 {d '2000-01-01'}, {d '2015-01-01'}, 'A12345'


MYSERVER
select SUser_SName() as [CurrentUser]


MYSERVER
select parent_name from containers where id = '{?@id}'

这些查询都不依赖于彼此,尽管第一个和最后一个查询使用相同的输入参数 - @id(在此示例中为A12345

run_report存储过程返回>时,上述工作正常。 0结果。当它没有返回任何结果时(但据我所知没有实际错误),第二个和第三个SQL查询似乎不会被执行,因为它们的结果(作为字段插入到报告中)只是空白。

我可以看到两种可能的解决方法:

  1. 重新排序SQL查询,以便始终首先返回结果,并且存储过程(可能不返回任何结果)最后运行;或
  2. 不知何故,即使存储过程查询没有返回任何行,我也会以快乐的方式继续使用Crystal Reports。
  3. ......但我不确定如何实现这两种方法。

1 个答案:

答案 0 :(得分:1)

我在SAP论坛上交叉发布并获得了this answer

有两种可能的解决方案

  1. 当没有实际结果时,使存储过程返回所有NULL值的单行。

  2. 将报告拆分为一个主报告和两个子报告。存储过程在主报表中运行,其他每个查询都在其自己的子报表中运行

  3. 我使用了解决方案#1(因为在我的情况下工作较少)并且工作正常。我将我的存储过程更改为SELECT INTO,结果被放入临时表中。然后我可以去:

    -- Do the main SELECT INTO query first, then...
    
    -- Check if temporary table is empty
    IF NOT EXISTS (SELECT TOP 1 Id FROM #report WHERE Id IS NOT NULL)
        BEGIN
            -- If the source table you SELECTed from had NOT NULL columns,
            -- you'll need to alter them prior to inserting your row of NULLS
            ALTER TABLE #report ALTER COLUMN Name VARCHAR(255) NULL
            -- Rinse and repeat for other affected columns
    
            -- Then insert the row of NULLS
            INSERT INTO #report VALUES(NULL, NULL, NULL, NULL, NULL, NULL)
        END
    
    -- Return the contents of the report
    SELECT * FROM #report