0

私はSQL Server 2014で作業しており、Microsoftのすぐに使えるReportServerデータベースを使用しています。このバグのために、サブスクリプションの優先度を引き出すスクリプトを作成する作業を続けてきました。

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

以下に貼り付けた 2 つのサンプル 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>jonjones@email.com;billiejean@email.com;prettyfloyd@email.com</Value>
  </ParameterValue>
  <ParameterValue>
    <Name>CC</Name>
    <Value>a@email.com;g@email.com.com;</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() 関数を正しく使用していると思います。これに正しくアプローチする方法についてのアイデアはありますか?

4

1 に答える 1

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'

楽しみ!

于 2016-09-09T18:44:57.587 に答える