2016-09-09 7 views
0

저는 SQL Server 2014 및 Microsoft의 Report Server 데이터베이스에서 작업하고 있습니다. 이 bug 때문에 구독 우선 순위를 끌어 올 스크립트를 만드는 작업을했습니다.ReportServerXML에서 구독 우선 순위를 추출하려면 어떻게해야합니까?

SQL, XQuery 및 XPath를 사용하여 다음 쿼리를 작성했습니다.

;WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition','http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd) 
,s 
as (SELECT 
     s.Report_OID 
    ,s.SubscriptionID 
    ,s.OwnerID 
    ,s.Description 
    ,s.LastStatus 
    ,s.EventType 
    ,CONVERT(XML,CONVERT(VARCHAR(MAX),s.ExtensionSettings)) AS reportXML 
    FROM ReportServer.dbo.Subscriptions as s 
    WHERE s.ExtensionSettings is not null 
    ) 
--SELECT s.reportxml.value('/ParameterValues[1]','varchar(150)') FROM s 

SELECT 
con.Report_OID 
,con.test 
FROM (SELECT 
     s.Report_OID 
     ,dsn.value('Name[1]','varchar(150)') as test 
     FROM s 
     cross apply reportxml.nodes('/ParameterValues/ParameterValue') as r(dsn) 
    ) con 

다음 두 개의 예제 XML 문서도 붙여 넣습니다.

<ParameterValues> 
     <ParameterValue> 
     <Name>FILENAME</Name> 
     <Field>subscriber_domestic_id</Field> 
     </ParameterValue> 
     <ParameterValue> 
     <Name>PATH</Name> 
     <Field>folder</Field> 
     </ParameterValue> 
     <ParameterValue> 
     <Name>RENDER_FORMAT</Name> 
     <Value>PDF</Value> 
     </ParameterValue> 
     <ParameterValue> 
     <Name>WRITEMODE</Name> 
     <Value>OverWrite</Value> 
     </ParameterValue> 
     <ParameterValue> 
     <Name>FILEEXTN</Name> 
     <Value>True</Value> 
     </ParameterValue> 
     <ParameterValue> 
     <Name>USERNAME</Name> 
     <Field>login</Field> 
     </ParameterValue> 
     <ParameterValue> 
     <Name>PASSWORD</Name> 
     <Field>mypasswordstackOF</Field> 
     </ParameterValue> 
    </ParameterValues> 

The second document here. 

<ParameterValues> 
    <ParameterValue> 
    <Name>TO</Name> 
    <Value>[email protected];[email protected];[email protected]</Value> 
    </ParameterValue> 
    <ParameterValue> 
    <Name>CC</Name> 
    <Value>[email protected];[email protected];</Value> 
    </ParameterValue> 
    <ParameterValue> 
    <Name>IncludeReport</Name> 
    <Value>True</Value> 
    </ParameterValue> 
    <ParameterValue> 
    <Name>RenderFormat</Name> 
    <Value>PDF</Value> 
    </ParameterValue> 
    <ParameterValue> 
    <Name>Subject</Name> 
    <Value>@ReportName was executed at @ExecutionTime</Value> 
    </ParameterValue> 
    <ParameterValue> 
    <Name>IncludeLink</Name> 
    <Value>True</Value> 
    </ParameterValue> 
    <ParameterValue> 
    <Name>Priority</Name> 
    <Value>NORMAL</Value> 
    </ParameterValue> 
</ParameterValues> 

모든 문서가 우선 순위가있는 것은 아닙니다. 내 현재 쿼리는 오류가 발생하지 않지만 아무 것도 반환하지 않습니다. 나는 nodes() 함수를 올바르게 사용하고 있다고 생각한다. 이 문제에 올바르게 접근하는 방법에 대한 아이디어가 있습니까? 미래의 목적을 위해

+0

실외에서 시도 했습니까? –

+0

예 Report_OID는 문제가 없지만 test 열에 대해서는 null입니다. – user6780741

+0

이 네임 스페이스가 필요합니까? XML에 네임 스페이스가 지정되어 있지 않습니다. 'WITH s as (SELECT ...)'만 시도하십시오 –

답변

0

누군가가 추출의 동일한 유형을 수행하고자하는 경우, 나는 아래에 내 코드를 붙여 해요 :

;WITH 
s 
as (SELECT 
     s.Report_OID 
    ,s.SubscriptionID 
    ,s.OwnerID 
    ,s.Description 
    ,s.LastStatus 
    ,s.EventType 
    ,CONVERT(XML,CONVERT(VARCHAR(MAX),s.ExtensionSettings)) AS reportXML 
    FROM ReportServer.dbo.Subscriptions as s (NOLOCK) 
    WHERE s.ExtensionSettings is not null 
    ) 

SELECT 
con.Report_OID 
,con.Node 
,con.PriorityLevel 
INTO #Temp 
FROM (SELECT 
     s.Report_OID 
     ,dsn.value('Name[1]','varchar(150)') as Node 
     ,dsn.value('Value[1]','varchar(150)') as PriorityLevel 
     FROM s 
     cross apply reportxml.nodes('/ParameterValues/ParameterValue') as r(dsn) 
    ) con 

SELECT 
t.Report_OID 
,c.Name as 'ReportName' 
,t.Node 
,t.PriorityLevel 
,c.Path 
FROM #Temp t 
    join ReportServer.dbo.Catalog c (NOLOCK) 
     on t.Report_OID = c.ItemID 
WHERE 1=1 
and Node = 'Priority' 

을 즐기십시오!