使用包含动态SQL的存储过程在C#中创建报表(报表查看器)

时间:2012-11-19 23:51:10

标签: c# sql-server stored-procedures sql-server-2008-r2 reportviewer

我有一个SQL Server存储过程,我想用它在我的应用程序中创建一个报告(c#)。

由于过程中的表是动态创建的,因此我无法使用它来创建报告。

如何使用此程序在我的应用程序中创建报告?

我正在使用VS2010,SQL Server 2008 R2

我在VS中创建了一个数据集但不确定如何从那里使用它。报告向导无法使用我创建的数据集。

我想过以某种方式使用它来创建一个视图,然后从中生成一个数据集但是无法解决这个问题。

我希望我已经为某人提供了足够的信息给我一些方向。

PROCEDURE sp_RD_Reporting_View_ExportedData_For_Period    
(   
@StartDate date,   
@EndDate date   
)  
AS  
CREATE TABLE #tmp  
(  
    StartDate DATETIME,  
    EndDate DATETIME,  
    FomatedDate VARCHAR(20)  
)  
--Calculate the date ranges   
;WITH Nbrs ( n ) AS (  
        SELECT 0 UNION ALL  
        SELECT 1+n FROM Nbrs WHERE n < 6 )  
INSERT INTO #tmp  
SELECT  
    DATEADD(DAY,-n,@StartDate),  
    DATEADD(DAY,-n,@EndDate),  
    convert(varchar, DATEADD(DAY,-n,@EndDate), 110)  
FROM  
    Nbrs  
ORDER BY  
    -n  
--The date columns for the pivot  
DECLARE @cols VARCHAR(MAX)  
SELECT  @cols = COALESCE(@cols + ','+QUOTENAME(FomatedDate),  
                     QUOTENAME(FomatedDate))    
FROM   
    #tmp  
--Declaring some dynamic sql and executing it  
DECLARE @query NVARCHAR(4000)=  
N'SELECT  
    *  
FROM  
(  
    SELECT   ExportData.EmployeeID AS EmpID,  
            ABRAempInfo.EmpFullName AS Name,  
            ExportData.PayType AS PayType,   
            tmp.FomatedDate,   
            SUM(ExportData.Quantity) AS Hours   
    FROM ExportData   
    JOIN ABRAempInfo    
    ON ExportData.EmployeeID = ABRAempInfo.EmpID  
    JOIN #tmp AS tmp  
    ON ExportData.ChargeDate = tmp.FomatedDate  
    WHERE ChargeDate BETWEEN tmp.StartDate AND tmp.EndDate  
    GROUP BY ExportData.EmployeeID, ExportData.PayType, tmp.FomatedDate,   ABRAempInfo.EmpFullName  

) AS p  
PIVOT  
(  
    SUM(Hours)  
    FOR FomatedDate IN ('+@cols+')  
) AS pvt'  

EXECUTE(@query)  
DROP TABLE #tmp  

1 个答案:

答案 0 :(得分:0)

我遇到了一些我认为类似的东西 - 试图让Linq转到Sql,从一个使用Dynamic SQL选择结果的存储过程中为我构建一个结果集。这就是我如何解决我的问题......这是一个很好的解决方法,但你真的无法让一个向导来处理动态结果集。另请注意,如果动态sql返回不同的列,则不太可能。

  1. 运行动态语句并仅输出SQL语句(打印语句,不执行它)
  2. 通过您从#1
  3. 获取的sql语句修改存储过程以返回输出
  4. 您现在拥有一个标准存储过程 - 使用它来构建您的报告。
  5. 在您的报告经过测试并正常工作后,再次修改存储过程并重新插入动态sql。