我正在使用SQL SERVER 2008 R2 . 我想从XML格式的RDL数据中提取数据集及其参数 . 我们可以在SSRS数据库中找到xml数据 . 表名是dbo.Catalog .
基于以下查询,我获得了报告的所有数据集 .
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
现在我想拥有每个数据集的所有参数,映射关系应该是report - dataset - parameter . 因此,一个报告可能具有多个数据集,并且数据集可能具有多个参数 .
我使用光标逐个浏览数据集以获得结果,但我相信有一种简单的方法可以获得它 .
我的查询如下
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
任何意见 ?
--- 2017-03-14 18:05:29 ---
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 C1.path AS Report_Path,
--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 dbo.Catalog c1
INNER JOIN dbo.Catalog c on c1.LinkSourceID=C.ItemID
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)/Operational Reporting/Finance/
WHERE C1.path like '/Regional Reporting/%/Finance/%'
UNION ALL
SELECT C1.path AS Report_Path,
--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 dbo.Catalog c1
INNER JOIN dbo.Catalog c on c1.LinkSourceID=C.ItemID
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)
WHERE C1.path like '/Regional Reporting/%/Finance/%' ) A
WHERE 1=1 and commandtext like 'global.gp_sec_pINSTANCE_COMPANIES'ORDER BY 1,2,3
--reference http://beyondrelational.com/modules/2/blogs/28/posts/10281/xquery-lab-2-an-example-using-outer-apply.aspx