我有一个简单的要求,在SQL Reporting Services中难以实现。
我的报告应该执行以下操作:
因此,如果用户输入数字100,则以25行打印100个标签。
出于好的理由,我需要使用SSRS - 标签包含条形码,我的第三方组件只能在SSRS中使用。我还希望将此报告与现有系统很好地集成,并使用所有SSRS好东西,如分页等。
如何做到这一点?显然,这个报告不需要任何SQL连接或数据,但是SSRS似乎不允许我在没有实际数据源的情况下使用Tablix。我试图在SQL中创建一个虚拟数据集,但我不知道如何创建查询返回给定行数的虚拟表。
如果只有使用嵌入在报告中的VB脚本的解决方案,我会很高兴。此刻我只能想到创建临时表并用我的数据填充它,是否有更优雅的解决方案?
答案 0 :(得分:1)
如果问题归结为查询返回A行,那么你应该研究用于生成数字表的SQL技术。这是一个简单的方法,最多可以完成25行。
select d1.n * 5 + d0.n
from
(select 0 union all select 1 union all select 2 union all select 3 union all select 4) as d0(n),
(select 0 union all select 1 union all select 2 union all select 3 union all select 4) as d1(n)
where d1.n * 5 + d0.n < A
答案 1 :(得分:1)
由于您不需要实际生成任何数据,因此您可以非常简单地创建一些生成(A / 4)行的内容。这将是Tablix中行的基础。
DECLARE @A INT = 100;
SELECT TOP (CAST(CEILING(@A / 4.0) AS INT)) AnyVal = 1
FROM sys.all_objects a, sys.all_objects b;
有number of other ways生成任意集合,并且循环/递归CTE的执行在它们之间没有太多选择。您仍然需要连接到数据库。
为了更进一步,您还可以详细说明需要显示的4列中的哪一列:
DECLARE @A INT = 5;
SELECT DisplayCol1 = 1,
DisplayCol2 = CASE WHEN RowNumber * 4 + 1 >= @A THEN 0 ELSE 1 END,
DisplayCol3 = CASE WHEN RowNumber * 4 + 2 >= @A THEN 0 ELSE 1 END,
DisplayCol4 = CASE WHEN RowNumber * 4 + 3 >= @A THEN 0 ELSE 1 END
FROM ( SELECT TOP (CAST(CEILING(@A / 4.0) AS INT))
RowNumber = ROW_NUMBER() OVER(ORDER BY a.object_id) - 1
FROM sys.all_objects a, sys.all_objects b
) t;
这给出了:
DisplayCol1 DisplayCol2 DisplayCol3 DisplayCol4
1 1 1 1
1 0 0 0
表示要显示总共5个标签,您只需要显示第2行的第一列。
答案 2 :(得分:1)
您需要建立与数据库的连接。使它对任何数据库都无关紧要,您可以使用以下语句来获取数字
DECLARE @A INT = 100;
SELECT DISTINCT number
FROM master..spt_values
WHERE number >= 1
AND number <= @A