除了运行配置文件跟踪来捕获 SQL 查询之外,是否有一种简单的方法可以查看 SSRS 实际生成的 SQL 查询?
在 BIDS 编辑器中是否有某种方法可以看到这一点?
您可以针对 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
简而言之,不。没有好的解决方法。但是,为了进行开发,我通常会在 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 中。
我通常做的是在运行报告时运行 SQL Profiler,并使用参数从中提取查询。
关闭文件,将扩展名从 .rdlc 更改为 .rdl,然后重新打开。它应该显示为 HTML。现在搜索“选择”就可以了!
您的报表服务器中可能有许多报表引用不同年份的 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;