SQL Server 如何通过SQL语句定位SSRS中的具体报表
在一些IT技术人员的推广、简单培训后,公司很多部门都有一些非IT技术人员参与开发各自需求的Reporting Service报表。原因很简单,罗列出来的原因大概有这样一些:
IT部门的考量:
1:IT部门这边工作量很大,跟进各个项目都力不从心。不想腾出精力和时间来解决各个部门层出不穷的报表需求。
2:IT技术人员可能对各个部门的业务的理解和那些精通业务的员工有一定的差距。业务人员才是真正懂得应用需求的核心人员。
3:这些报表的需求变跟和后续维护实在是一个不小的工作量。IT的人手、资源实在有些不足。
4:这些零零散散的报表体现不了工作量,体现不了绩效。原因你懂的。
………………………………………………………………………………
业务部门考量:
1:公司各个部门确实需要各类报表,跟进生产进度、调整生产计划,作出相关决策。这个需求的的确确是刚性需求。而且有利于提高生效效率。
2:业务人员虽然精通业务,仅仅熟悉制作Excel报表。对IT技术不了解,但是经过培训、推广后,发现Reporting Service的报表确实开发简单、而且图文并茂,美观大方。最重要的是可以重复使用,而且可以订阅、推送,大大节省了他们制作报表的时间和工作量。所以学习制作报表的热情和激情高涨
3:他们提出的需求不能得到IT部门的快速响应。有时候一拖就是一天或者几天。而需求总是在变化,他们迫切希望自己掌控这些变化。
…………………………………………………………………………………………………………………………….
结果他们“郎有情妾有意”一拍即合,结果给我整出无数的琐碎事情:一来很多人申请Reporting Service的相关权限,很多人发布更新报表。事情倒不复杂,只是琐碎繁杂,烦不胜烦,只能将一些权限下放。这个问题解决了,但是随之而来的一个更大的问题,那些没有经过专业培训的业务人员写出的SQL实在是让人大跌眼镜。有时候严重影响数据库性能。我们通过监控工具能定位到是那个Reporting Service报表发出的问题SQL,但是要如何定位到具体的报表,这样才能找到报表的Owner,督促其修改、优化SQL。否则即使我们定位了问题SQL以及知道如何优化,但是不能修改对应的报表,也只能看着问题重演。如果只是简单的将SQL发给这么一大批人,让他们自己去甄别,刷选,这个沟通的成本太高,而且效率低下,效果非常差。
搜索了一些关于Reporting Service中报表的资料,我们知道Reporting Service报表的内容都保存在ReportServer这个数据库的dbo.Catalog表中,但是官方没有关于Catalog这些系统表的相关文档。仅仅是一些对SSRS感兴趣的人做了一些深入研究,相关资料如下
关于Type字段的值代表的意义:
1 = Folder
2 = Report
3 = Resources
4 = Linked Report
5 = Data Source
6 = Report Model
7 = Report Part (SQL 2008 R2, unverified)
8 = Shared Dataset (SQL 2008 R2)
报表的XML信息保存在Catalog的Content字段中,但是Content的数据类型为Image(这个相当纳闷,不清楚为什么是这样一个设计?),如下所示,我们可以做一个转换
我们在转换成XML的文本中就能找到对应的SQL,节点一般为为/Report/DataSets/DataSet/Query/CommandText如下截图所示:
将报表内容转换为XML后,需要从XML中模糊搜索才能定位SQL出自那张报表,如下所示
WITH ItemContentBinaries AS
(
SELECT ItemID ,
Name ,
[Type] ,
CASE Type
WHEN 2 THEN 'Report'
WHEN 5 THEN 'Data Source'
WHEN 7 THEN 'Report Part'
WHEN 8 THEN 'Shared Dataset'
ELSE 'Other'
END AS TypeDescription ,
CONVERT(VARBINARY(MAX), Content) AS Content
FROM ReportServer.dbo.Catalog
WHERE Type IN ( 2, 5, 7, 8 )
),
ItemContentNoBOM AS
(
SELECT ItemID ,
Name ,
[Type] ,
TypeDescription ,
CASE WHEN LEFT(Content, 3) = 0xEFBBBF
THEN CONVERT(VARBINARY(MAX), SUBSTRING(Content, 4,
LEN(Content)))
ELSE Content
END AS Content
FROM ItemContentBinaries
)
,ItemContentXML AS
(
SELECT
ItemID,Name,[Type],TypeDescription
,CONVERT(xml,Content) AS ContentXML
FROM ItemContentNoBOM
)
SELECT
ItemID,Name,[Type],TypeDescription,ContentXML
,ISNULL(Query.value('(./*:CommandType/text())[1]','nvarchar(1024)'),'Query') AS CommandType
,Query.value('(./*:CommandText/text())[1]','nvarchar(max)') AS CommandText
FROM ItemContentXML
CROSS APPLY ItemContentXML.ContentXML.nodes('//*:Query') Queries(Query)
WHERE Query.value('(./*:CommandText/text())[1]','nvarchar(max)') LIKE '%SQL Script Content%';
不过这个SQL的性能实在慢的让人抓狂。如果有多个SQL需要定位,实在是一件折磨人的事情,我们可以将上面结果放入一张中间表或全局临时表,然后就可以快速、反复的定位SQL来自那种报表了。
WITH ItemContentBinaries AS
(
SELECT ItemID ,
Name ,
[Type] ,
CASE Type
WHEN 2 THEN 'Report'
WHEN 5 THEN 'Data Source'
WHEN 7 THEN 'Report Part'
WHEN 8 THEN 'Shared Dataset'
ELSE 'Other'
END AS TypeDescription ,
CONVERT(VARBINARY(MAX), Content) AS Content
FROM ReportServer.dbo.Catalog
WHERE Type IN ( 2, 5, 7, 8 )
),
ItemContentNoBOM AS
(
SELECT ItemID ,
Name ,
[Type] ,
TypeDescription ,
CASE WHEN LEFT(Content, 3) = 0xEFBBBF
THEN CONVERT(VARBINARY(MAX), SUBSTRING(Content, 4,
LEN(Content)))
ELSE Content
END AS Content
FROM ItemContentBinaries
)
,ItemContentXML AS
(
SELECT
ItemID,Name,[Type],TypeDescription
,CONVERT(xml,Content) AS ContentXML
FROM ItemContentNoBOM
)
SELECT
ItemID,Name,[Type],TypeDescription,ContentXML
,ISNULL(Query.value('(./*:CommandType/text())[1]','nvarchar(1024)'),'Query') AS CommandType
,Query.value('(./*:CommandText/text())[1]','nvarchar(max)') AS CommandText
INTO ##ReportContent
FROM ItemContentXML
CROSS APPLY ItemContentXML.ContentXML.nodes('//*:Query') Queries(Query);
SELECT * FROM ##ReportContent
WHERE CommandText LIKE '%使用报表的部分SQL来替换%'
如下样例所示,已经知道报表的名字,以及报表ItemID,如果你想知道报表的详细路径,通过ItemID查询ReportServer.dbo.Catalog即可得到你想要的路径信息。

参考资料:
http://bretstateham.com/extracting-ssrs-report-rdl-xml-from-the-reportserver-database/
SQL Server 如何通过SQL语句定位SSRS中的具体报表的更多相关文章
- PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法
逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...
- SQL SERVER如何通过SQL语句获服务器硬件和系统信息
在SQL SERVER中如何通过SQL语句获取服务器硬件和系统信息呢?下面介绍一下如何通过SQL语句获取处理器(CPU).内存(Memory).磁盘(Disk)以及操作系统相关信息.如有不足和遗漏,敬 ...
- SQL Server Profiler监控执行语句
SQL Server Profiler监控执行语句,这个功能主要用在实时的监控对数据库执行了什么操作,从而及时有效的跟踪系统的运行. 常规配置选项,名称.模板.保存到文件(可以复用). 事件选择,可以 ...
- SQL Server 定时执行SQL语句的方法
SQL SERVER 定时任务,你可以启动一下.不过要想更加直观的控制,直接写一个程序,定时执行你的存储过程. 1.设置“SQL Server 代理”(SQL Server Agent)服务随系统启动 ...
- SQL Server FOR XML PATH 语句的应用---列转行
经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法.在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用 ...
- 【SQL Server DBA】维护语句:删除并创建外键约束、获取建表语句
原文:[SQL Server DBA]维护语句:删除并创建外键约束.获取建表语句 1.删除外键约束,建立外键约束 先建立3个表: /* drop table tb drop table tb_b dr ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)
为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)
计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...
随机推荐
- 【初探Spring】------Spring IOC(二):初始化过程---简介
首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...
- spring声明式事务管理总结
事务配置 首先在/WEB-INF/applicationContext.xml添加以下内容: <!-- 配置事务管理器 --> <bean id="transactionM ...
- GroupData群数据库的还原与优化
一.背景 这个数据库的数据文件mdf大概有83G左右,当还原数据库之后感觉可以做很多性能方面上的调优,合并数据后mdf数据文件大概有59G左右,行压缩后mdf数据文件大概有39G左右,页压缩后mdf数 ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- ios 音视频实现边播边缓存的思路和解决方案 (转)
本片为转载内容,主要是以后自己看起来方便一些 原文地址:iOS音视频实现边下载边播放 其实音视频本地缓存的思想都差不多,都需要一个中间对象来连接播放器和服务器. 近段时间制作视频播放社区的功能,期间查 ...
- 为什么基于Windows Server 2008 R2的网络负载均衡(NLB)配置的时候总会报错“主机不可访问”?
配置基于Windows的网络负载均衡是很容易的,操作也很简单,点点鼠标基本上就能完成,但是在进行节点(真实服务器)操作的过程中有时候会遇到一些主机不可访问的报错信息.这个又是为什么呢? Figure ...
- Linux平台oracle 11g单实例 + ASM存储 安装部署 快速参考
操作环境:Citrix虚拟化环境中申请一个Linux6.4主机(模板)目标:创建单机11g + ASM存储 数据库 1. 主机准备 2. 创建ORACLE 用户和组成员 3. 创建以下目录并赋予对应权 ...
- 读书笔记--SQL必知必会07--创建计算字段
7.1 计算字段 字段(field),基本与列(column)含义相同. 利用计算字段可以直接从数据库中检索出转换.计算或格式化过的数据. 计算字段不实际存在于数据库表中,是运行时在SELECT语句内 ...
- 搭建了个人的github.io博客
地址:http://www.shutu.tech 说明: 基于github + hexo简易搭建的个人博客,用于收藏经典博文及技术文章,也会用于个人的技术成长记录.我是看到这篇文章搭建的:http:/ ...
- php内核分析(四)-do_cli
这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux # main 把剩下的代码增加了下注释全部贴出来了(这个是简化后的main函数,去掉了一些无关紧要的代码段): int m ...


