SQL Server XML Xquery 如何获取RDL 文件中dataset 对应的参数。

十林 2013-12-26 05:02:41
我可以通过下面的query 获得SSRS report中所有的dataset。

WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition')
--Extract all the Datasets of a report, above URI also can be http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition

SELECT C.path AS REPORT_PATH,
T2.DN.value('.', 'varchar(200)') AS DataSetName
FROM dbo.Catalog c
CROSS APPLY (SELECT CONVERT(XML, CONVERT(VARBINARY(max), c.content)) xmlCriteria) a
CROSS APPLY A.xmlCriteria.nodes('//DataSets/DataSet/@Name') AS T2(DN)
WHERE C.Type=2

现在我想获得这些dataset 所对应的parameter。 一个dataset 有可能多个parameter,这里是1对多的关系。

我写了下面的query来获得,但是总觉得不合适。不知哪位高人有办法得到,先拜谢了!


DECLARE @RetVal TABLE
(
REPORT_PATH VARCHAR(500),
DATASETNAME VARCHAR(200)
);

WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition')
--Extract all the Datasets of a report
INSERT INTO @RetVal
SELECT C.path AS REPORT_PATH,
T2.DN.value('.', 'varchar(200)') AS DataSetName
FROM dbo.Catalog c
CROSS APPLY (SELECT CONVERT(XML, CONVERT(VARBINARY(max), c.content)) xmlCriteria) a
CROSS APPLY A.xmlCriteria.nodes('//DataSets/DataSet/@Name') AS T2(DN)
WHERE C.Type=2
DECLARE @REPORT_PATH VARCHAR(200)
DECLARE @DataSetName VARCHAR(200)
DECLARE DataSets CURSOR FOR
SELECT * FROM @RetVal

OPEN DataSets

FETCH NEXT FROM DataSets INTO @REPORT_PATH, @DataSetName

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @DataSetName;

DECLARE @A VARCHAR(10)='';--with should start with ;

--Extract all the parameters of the report Datasets
WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition')
SELECT @REPORT_PATH AS Report_Path,
@DataSetName AS Dataset,
T3.QP.value('.', 'varchar(200)') AS Dataset_Parameter,
T4.CT.value('.', 'varchar(200)') AS Command_Text
FROM dbo.Catalog c
CROSS APPLY (SELECT CONVERT(XML, CONVERT(VARBINARY(max), c.content)) xmlCriteria) a
CROSS APPLY A.xmlCriteria.nodes('//DataSets/DataSet[@Name=sql:variable("@DataSetName")]/Query/QueryParameters/QueryParameter/@Name')AS T3(QP)
CROSS APPLY A.xmlCriteria.nodes('//DataSets/DataSet[@Name=sql:variable("@DataSetName")]/Query/CommandText')AS T4(CT)
WHERE C.path = @REPORT_PATH

FETCH NEXT FROM DataSets INTO @REPORT_PATH, @DataSetName
END

CLOSE DataSets

DEALLOCATE DataSets

...全文
178 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
十林 2014-04-10
  • 打赏
  • 举报
回复
问题解决了。 重用cross apply 后的“节点”。这样就不用在使用cursor了

WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' AS URI1,
'http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition' AS URI2,DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition')

      SELECT DISTINCT *FROM(
      SELECT
             T2.DP.value('.', 'varchar(200)') AS Description,
             T4.CT.value('.', 'varchar(200)') AS CommandText,
             T5.PN.value('.', 'varchar(200)') AS Dataset_Parameter,
             NULL STORED_PROCEDURE
      FROM   ReportServer$GLBSMCSS01.dbo.Catalog c
             CROSS APPLY (SELECT CONVERT(XML, CONVERT(VARBINARY(max), c.content)) xmlCriteria) a
             CROSS APPLY A.xmlCriteria.nodes('//Description')AS T2(DP)
             CROSS APPLY A.xmlCriteria.nodes('//DataSets/DataSet')AS T3(QP)
             CROSS APPLY T3.QP.nodes('Query/CommandText')AS T4(CT)
             CROSS APPLY T3.QP.nodes('Query/QueryParameters/QueryParameter/@Name') AS T5(PN)
             --CROSS APPLY A.xmlCriteria.nodes('//DataSets/DataSet[@Name=''GetCompanyDetails'']/Query/QueryParameters/QueryParameter/@Name')AS T3(QP)
             --CROSS APPLY A.xmlCriteria.nodes('//DataSets/DataSet[@Name=''GetCompanyDetails'']/Query/CommandText')AS T4(CT)
 
      UNION ALL
      SELECT 
             T2.DP.value('.', 'varchar(200)') AS Description,
             T4.CT.value('.', 'varchar(200)') AS CommandText,
             T3.QP.value('.', 'varchar(200)') AS Dataset_Parameter,
             NULL STORED_PROCEDURE
      FROM   ReportServer$GLBSMCSS01.dbo.Catalog c
             CROSS APPLY (SELECT CONVERT(XML, CONVERT(VARBINARY(max), c.content)) xmlCriteria) a
             CROSS APPLY A.xmlCriteria.nodes('//URI2:Description')AS T2(DP)
             CROSS APPLY A.xmlCriteria.nodes('//URI2:DataSets/URI2:DataSet')AS T3(QP)
             CROSS APPLY T3.QP.nodes('URI2:Query/URI2:CommandText')AS T4(CT)
             CROSS APPLY T3.QP.nodes('URI2:Query/URI2:QueryParameters/URI2:QueryParameter/@Name') AS T5(PN)
             --CROSS APPLY A.xmlCriteria.nodes('//URI2:DataSets/URI2:DataSet[@Name=''GetCompanyDetails'']/URI2:Query/URI2:QueryParameters/URI2:QueryParameter/@Name')AS T3(QP)
             --CROSS APPLY A.xmlCriteria.nodes('//URI2:DataSets/URI2:DataSet[@Name=''GetCompanyDetails'']/URI2:Query/URI2:CommandText')AS T4(CT)
) A
      WHERE 1=1 ORDER BY 1,2,3
      
      
      --reference http://beyondrelational.com/modules/2/blogs/28/posts/10281/xquery-lab-2-an-example-using-outer-apply.aspx

十林 2014-01-14
  • 打赏
  • 举报
回复
貌似得沉了这帖子。。
orochiheart 2014-01-04
  • 打赏
  • 举报
回复
不懂帮顶!
十林 2014-01-02
  • 打赏
  • 举报
回复
来个大神吧!

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧