查看 SSRS 报告生成的 SQL 查询的简单方法?

问题描述 投票:0回答:5

除了运行配置文件跟踪来捕获 SQL 查询之外,是否有一种简单的方法可以查看 SSRS 实际生成的 SQL 查询?

在 BIDS 编辑器中是否有某种方法可以看到这一点?

t-sql sql-server-2008 ssrs-2008
5个回答
8
投票

您可以针对 SSRS 报表服务器运行如下所示的内容。您将能够看到报告数据集正在执行的 SQL。

;WITH XMLNAMESPACES (
    DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition',
    'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd
),
ReportData AS
(
    SELECT name ReportName
           , x.value('CommandType[1]', 'VARCHAR(50)') AS CommandType
           , x.value('CommandText[1]','VARCHAR(8000)') AS CommandText
           , x.value('DataSourceName[1]','VARCHAR(50)') AS DataSource
    FROM (SELECT  name
                  , CAST(CAST(content AS VARBINARY(MAX)) AS XML) AS reportXML
            FROM  ReportServer.dbo.Catalog
            WHERE content IS NOT NULL
                  AND type != 3) a
                  CROSS APPLY reportXML.nodes('/Report/DataSets/DataSet/Query') r(x)
)

SELECT *
FROM ReportData

4
投票

简而言之,不。没有好的解决方法。但是,为了进行开发,我通常会在 SSRS 中的工作旁边创建一个测试查询。我会在 Management Studio 中编辑此内容,然后将值粘贴回 BIDS 中。假设有两个名为“StudentID”和“TeacherID”的参数,查询如下所示:

DECLARE @StudentID int
DECLARE @TeacherID int

SELECT @StudentID = StudentID FROM Students WHERE StudentName LIKE 'John Doe'
SELECT @TeacherID = TeacherID FROM Teachers WHERE TeacherName LIKE 'Mr. Jones'

-- PASTE IN QUERY FROM BIDS BELOW

这使我可以使用下拉参数列表中的真实文本值,然后简单地粘贴到我的查询中。然后我可以在 Management Studio 中优化查询,然后当我对结果感到满意时将其粘贴回 BIDS 中。


3
投票

我通常做的是在运行报告时运行 SQL Profiler,并使用参数从中提取查询。


0
投票

关闭文件,将扩展名从 .rdlc 更改为 .rdl,然后重新打开。它应该显示为 HTML。现在搜索“选择”就可以了!


0
投票

您的报表服务器中可能有许多报表引用不同年份的 XML 命名空间。下面的查询建立了许多命名空间,然后对所有命名空间进行查询。

-- Declare various XML namespaces used throughout various reports
;WITH XMLNAMESPACES (
    DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition',
    'http://schemas.microsoft.com/sqlserver/reporting/reportdesigner' AS rd_2005,
    'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' AS rd_2008,
    'http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition' AS rd_2010,
    'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition' AS rd_2016,
    'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd_reportdesigner,
    'http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition' AS cl_2010
),
-- Cast content as XML file
ReportData AS (
    SELECT 
        name AS ReportName,
        CAST(CAST(content AS VARBINARY(MAX)) AS XML) AS reportXML
    FROM 
        ReportServer.dbo.Catalog
    WHERE 
        content IS NOT NULL
        AND type != 3
),
-- Parse each XML file across all the different XML namespace formats
ReportContents AS (
    SELECT 
        ReportName,
        reportXML.value('(//rd_2005:DataSourceName)[1]', 'VARCHAR(100)') AS DataSourceName,
        reportXML.value('(//rd_2005:CommandType)[1]', 'VARCHAR(100)') AS CommandType,
        reportXML.value('(//rd_2005:CommandText)[1]', 'VARCHAR(MAX)') AS CommandText
    FROM 
        ReportData
    UNION ALL
    SELECT 
        ReportName,
        reportXML.value('(//rd_2008:DataSourceName)[1]', 'VARCHAR(100)') AS DataSourceName,
        reportXML.value('(//rd_2008:CommandType)[1]', 'VARCHAR(100)') AS CommandType,
        reportXML.value('(//rd_2008:CommandText)[1]', 'VARCHAR(MAX)') AS CommandText
    FROM 
        ReportData
    UNION ALL
    SELECT 
        ReportName,
        reportXML.value('(//rd_2010:DataSourceName)[1]', 'VARCHAR(100)') AS DataSourceName,
        reportXML.value('(//rd_2010:CommandType)[1]', 'VARCHAR(100)') AS CommandType,
        reportXML.value('(//rd_2010:CommandText)[1]', 'VARCHAR(MAX)') AS CommandText
    FROM 
        ReportData
    UNION ALL
    SELECT 
        ReportName,
        reportXML.value('(//rd_2016:DataSourceName)[1]', 'VARCHAR(100)') AS DataSourceName,
        reportXML.value('(//rd_2016:CommandType)[1]', 'VARCHAR(100)') AS CommandType,
        reportXML.value('(//rd_2016:CommandText)[1]', 'VARCHAR(MAX)') AS CommandText
    FROM 
        ReportData
    UNION ALL
    SELECT 
        ReportName,
        reportXML.value('(//rd_reportdesigner:DataSourceName)[1]', 'VARCHAR(100)') AS DataSourceName,
        reportXML.value('(//rd_reportdesigner:CommandType)[1]', 'VARCHAR(100)') AS CommandType,
        reportXML.value('(//rd_reportdesigner:CommandText)[1]', 'VARCHAR(MAX)') AS CommandText
    FROM 
        ReportData
    UNION ALL
    SELECT 
        ReportName,
        reportXML.value('(//rd_reportdesigner//cl_2010:DataSourceName)[1]', 'VARCHAR(100)') AS DataSourceName,
        reportXML.value('(//rd_reportdesigner//cl_2010:CommandType)[1]', 'VARCHAR(100)') AS CommandType,
        reportXML.value('(//rd_reportdesigner//cl_2010:CommandText)[1]', 'VARCHAR(MAX)') AS CommandText
    FROM 
        ReportData
)
-- Final selection
SELECT DISTINCT * 
FROM ReportContents
WHERE CommandText IS NOT NULL
ORDER BY ReportName, DataSourceName;
© www.soinside.com 2019 - 2024. All rights reserved.