Crystal 如果第一个查询 returns 没有结果,报告不会执行所有数据库查询

Crystal Reports does not execute all database queries if first query returns no results

我有一份 Crystal 报告(使用 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}'

None 这些查询相互依赖,尽管第一个和最后一个查询使用相同的输入参数 - @id(在本例中为 A12345

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

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

  1. 重新排序 SQL 查询,以便始终 return 结果 运行 首先是存储过程(可能 return 没有结果)运行最后一个;或
  2. 即使存储过程查询没有 return 任何行,我还是让 Crystal 报告以其愉快的方式继续。

...但我不确定如何实现这两种方法。

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

有两种可能的解决方案

  1. 当没有实际结果时,使存储过程 return 成为所有 NULL 值的一行。

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

我使用了解决方案 #1(因为在我的案例中它的工作量较小)并且效果很好。我将存储过程更改为 SELECT INTO,并将结果放入临时 table。然后我可以去:

-- 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