我有一个返回多个结果集的存储过程,如下所示
CREATE StoredProcedure sp_MultipleDataSets
AS
BEGIN
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
END
在BIDS中,在创建新报告时,我为dataset配置了存储过程。它只创建包含从第一个结果集返回的列的数据集。它不标识第二个结果集。
如何从上述存储过程中为这两个结果集创建数据集
发布于 2014-10-10 06:14:44
我一直使用SP中的一个参数来拉取SSRS中的多个结果集。您必须通过SP中的IF语句将它们分开,然后您还必须手动键入SSRS数据集设置中的字段。
看起来怪怪的,但它很有效。
下面是一个例子。
存储过程(SP)定义了两个参数@OfficerID @DatasetFlag
@OfficerID是必须输入密码或输入的Employee # (SSRS数据输入表单)。DatasetFlag是我控制在SP中执行哪条IF语句的方式。
下面是SP:
CREATE PROCEDURE [dbo].[StoredProcedureNameHere]
@OfficerID VARCHAR(7),
@DatasetFlag VARCHAR(60)
WITH RECOMPILE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON;
BEGIN TRY
IF @DatasetFlag = 'EmployeeName'
Begin
SELECT [EmployeeName]
FROM [DatabaseName].[scema].[Employee]
where EmployeeBNumber = @OfficerID
END
ELSE
IF @DatasetFlag = 'Expect'
Begin
SELECT
[TerritoryName]
,[TestNumber]
,[RuleNumber]
,[Expectation]
,[TestCount]
,[PercentToGoal]
FROM [Database].[scema].[Table2]
WHERE OfficerID = @OfficerID
ORDER BY TerritoryID
,TestNumber
,RuleNumber
END
RETURN
GO
这个报告有两个数据集,一个是我创建的,它会拉入参数,另一个是我创建的EmployeeName,它会拉入EmployeeName,因为SSRS只能使用一个结果集~!但是...我骗了它..。
但我只是简单地通过OVERTYPING EMPLOYENAME创建字段,然后添加其余的(查询),因此编辑数据集属性中的字段并输入Select列名。
然后,我使用参数菜单(数据集属性)为第一个数据集输入="EmployeeName“表达式,为第二个数据集输入="Expect”表达式。我也匹配了那个屏幕上的@OfficeID。
然后当我运行这个的时候。它要求输入OfficerID (RS创建输入表单),以及当我输入ID并点击查看报告时。或者我们可以使用OfficerID来处理所有的RDL,就像SSRS表单所做的那样,只不过是在一个ASPX页面中。
两个数据集都会返回(我假设它会调用两次)
因此,在UNION数据集上没有奇怪的过滤或其他技巧,我必须在SSRS中处理,这并不有趣……(说真的,IIF?)
我见过一个存储过程,其中我们有大约20个参数,因此您可以在SQL级别过滤报告的输出,而不是在报告中进行巨大的提取和过滤。
不,您可以简单地创建20个存储过程,是的,但是这样,所有代码都在一个位置,当然它可以使用selects into TEMP table来合并成吨的内容,最后只需填充结果集的表即可。
作为一名程序员,我发现SSRS有点古怪,但到目前为止,我很开心,试图找到获得我想要的东西的方法,而不是它提供的东西……
发布于 2012-02-16 21:52:05
试试这样的东西:
Create StoredProcedure sp_MultipleDataSets(@Param nvarchar(10))
as
begin
if(@Param == "first")
begin
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
end
if(@Param == "second")
begin
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
end
end
发布于 2016-11-05 02:41:40
这里有一个技巧可以解决这个问题。这遵循了Union All
一个表的所有结果的想法,并使用SSRS repost with table
对于每个单独的查询,添加一个列,其中显示查询的目的,例如“姓名”或“地址”,对于查询的每一行重复该信息。
然后对想要的查询进行Union All
。
在Visual Studio / SSRS报告中:添加包含storedprocedure的数据集。然后从tools中选择tablix并将所需数据拖动到tablix列。然后转到tablix行属性->行可见性。for there使排序子句带有IFF函数,以便在查询时仅显示具有先前定义的额外列的行,例如“名称”
然后创建第二个tablix并遵循相同的方法,现在使用带有"Address“的IIF函数,然后继续使用所需的多个不同的表。
https://stackoverflow.com/questions/9310736
复制相似问题