Share via


SSRS - RDL Compare

This article shares the information on how to compare two versions of the same report .

Sometimes we might be in a need to compare the changes in two versions of the same report.

We can observe the changes easily on the report if it is a color modification or something like this,
What if , if the change is in terms of sizing ?

So to gather the reports background information and compare the changes in the two versions of the same report ,
we are going to make use of RDL files of the report in the default location :
C:\Users\Sathya\Documents\Visual Studio 2010\Projects\Report1\Report1\Version1.rdl
C:\Users\Sathya\Documents\Visual Studio 2010\Projects\Report1\Report1\Version2.rdl

Two methods to get the XML content of the report :

1.)After the report is deployed,XML content of the report can be fetched from :

 

      SELECT content FROM ReportServer.dbo.catalog

2.)Bulk insert XML from RDL files in the default location :
C:\Users\Sathya\Documents\Visual Studio 2010\Projects\Report1\Report1\Version1.rdl
C:\Users\Sathya\Documents\Visual Studio 2010\Projects\Report1\Report1\Version2.rdl

In this example, we have followed method 2 . After getting the XML of the two versions of the report ,
using Xquery and nodes() method , we can easily share the values in the XML nodes and compare the values .

Consider I have two versions of the same report as Version1.rdl and Version2.rdl

Below are the screenshots of the two versions of same report  :

Version1 and Version2 report has textbox  with below expression :

 

      =    "User : "    +User!UserID+VBCRLF+    "ExecutionTime : "    +Globals!ExecutionTime  

Version1 report has a table with below query as dataset :

DECLARE @Tmp TABLE (Id INT,Name VARCHAR(20)) 
 
INSERT @Tmp SELECT 1,'Sathya'
INSERT @Tmp SELECT 2,'Deepak'
 
SELECT * FROM @Tmp
 

Version2 report has a table with below query as dataset :

 

      DECLARE @Tmp TABLE (Id INT,Name VARCHAR(20)) 
   
      INSERT @Tmp SELECT 1,'Sathya'
      INSERT @Tmp SELECT 2,'Deepak'
   
      SELECT * FROM @Tmp 
      WHERE Name   = @Name

Difference between version1 and version2 reports :

1.)Version2 has textbox with background color .
2.)Version2 has table with background color for header and text centre aligned .
3.)Version2 has input parameter .
4.)Version2 has textbox and table inside rectangle container with background color .

Below Stored procedure can be used to get the compared resultset of two versions of the same report :

USE AdventureWorks2012 
GO 
 
   
 
CREATE PROCEDURE   RDL_Compare 
 
@RDLFileName1 NVARCHAR(256), --File path of the version1 of the RDL  
@RDLFileName2 NVARCHAR(256) --File path of the version2 of the RDL  
 
AS
 
BEGIN
 
SET NOCOUNT ON
SET XACT_ABORT ON
 
 
BEGIN TRY 
/*Bulk inserting XML from   RDL file */ 
 
   
 
   
 DECLARE @Query NVARCHAR(MAX) 
 
   
 CREATE TABLE   #Version1_Rdl(XMLData XML) 
 CREATE TABLE   #Version2_Rdl(XMLData XML) 
 
  BEGIN TRANSACTION
 
    SET @Query = 'INSERT INTO #Version1_Rdl(XMLData) 
    SELECT * FROM OPENROWSET( 
    BULK '''+@RDLFileName1+''', 
    SINGLE_BLOB) AS x;'
 
EXEC (@Query) 
 
    SET @Query = 'INSERT INTO #Version2_Rdl(XMLData) 
    SELECT * FROM OPENROWSET( 
    BULK '''+@RDLFileName2+''', 
    SINGLE_BLOB) AS x;'
 
EXEC (@Query) 
 
  
/*Bulk inserting XML from   RDL file */ 
 
   
SELECT
tmp1.ColumnHeader ColumnHeader_V1, 
tmp1.ColumnName ColumnName_V1, 
tmp1.ColumnValue ColumnValue_V1, 
tmp2.ColumnHeader ColumnHeader_V2, 
tmp2.ColumnName ColumnName_V2, 
tmp2.ColumnValue ColumnValue_V2, 
ISNULL(tmp1.ColumnHeader,tmp2.ColumnHeader)  Header1Compare, 
ISNULL(tmp1.ColumnName,tmp2.ColumnName)  Header2Compare, 
ISNULL(tmp1.ColumnValue,tmp2.ColumnValue)  ValueCompare 
FROM ( 
SELECT
 
       i.value('local-name(..)','varchar(max)') ColumnHeader, 
       i.value('local-name(.)','varchar(max)') ColumnName, 
       i.value('.','varchar(MAX)') ColumnValue 
FROM #Version1_Rdl V1 
CROSS APPLY V1.XMLData.nodes('//*[text()]') x(i) ) tmp1 
FULL OUTER  JOIN
( 
SELECT
       i.value('local-name(..)','varchar(max)') ColumnHeader, 
       i.value('local-name(.)','varchar(max)') ColumnName, 
       i.value('.','varchar(MAX)') ColumnValue 
FROM #Version2_Rdl V2 
CROSS APPLY V2.XMLData.nodes('//*[text()]') x(i) 
) tmp2  
ON tmp1.ColumnHeader = tmp2.ColumnHeader AND tmp1.ColumnName = tmp2.ColumnName 
AND tmp1.ColumnValue = tmp2.ColumnValue 
WHERE (tmp1.ColumnHeader IS  NULL  AND  tmp1.ColumnName IS   NULL  AND tmp1.ColumnValue IS   NULL)  
OR (tmp2.ColumnHeader IS  NULL  AND  tmp2.ColumnName IS   NULL  AND tmp2.ColumnValue IS   NULL)  
 
   
   COMMIT TRANSACTION
 
END TRY 
 
BEGIN CATCH 
 
DECLARE @ERROR_MESSAGE NVARCHAR(256) 
 
SELECT @ERROR_MESSAGE = ERROR_MESSAGE() 
   
IF @@TRANCOUNT > 0 
 
BEGIN
 
ROLLBACK TRANSACTION
  
END 
 
RAISERROR(@ERROR_MESSAGE,16,1) 
 
END CATCH 
 
END
 

Execute above created Stored procedure to get the compared resultset of two versions of the same report :

 

      USE AdventureWorks2012   
      GO   
   
      EXEC RDL_Compare 
      'C:\Users\Sathya\Documents\Visual Studio 2010\Projects\Report1\Report1\Version1.rdl'    ,   
      'C:\Users\Sathya\Documents\Visual Studio 2010\Projects\Report1\Report1\Version2.rdl'  

 


See Also

SQL Server Reporting Services Portal
List of Award Winning TechNet Guru Articles
My SSRS Articles
My Articles on SQL Server XML