2014-01-25 5 views
0

У меня есть XQuery, который проверяет наличие задач по восстановлению индекса в планах обслуживания SQL Server 2008 R2.Примените IF EXISTS к результатам XQuery

Как обернуть IF EXISTS вокруг этого или использовать метод XQuery .exist? Я просто хочу получить логическое значение из этого запроса на основе того, были ли найдены строки.

;WITH XMLNAMESPACES 
    (
     'www.microsoft.com/SqlServer/Dts' AS DTS 
     ,'www.microsoft.com/SqlServer/Dts/Tasks' AS SQLTask) 


    SELECT 
     Nodes.node.value('(@DTS:ExecutableType)[1]', 'varchar(200)') AS ExecutableType, 
     Nodes.node.value('(DTS:Property[@DTS:Name="ObjectName"])[1]', 'varchar(50)') AS ObjectName 
    FROM 
     (
     SELECT 
      CAST(CAST([packagedata] as varbinary(max)) as xml) PackageDataXml 
     FROM [msdb].[dbo].[sysmaintplan_subplans] sub 
      JOIN msdb.dbo.sysssispackages pack on sub.plan_id = pack.id 
      JOIN msdb.dbo.sysssispackagefolders fold on pack.folderid = fold.folderid 
      JOIN msdb.dbo.sysjobs jobs on sub.job_id = jobs.job_id 
      JOIN msdb.dbo.sysjobschedules jsched on jobs.job_id = jsched.job_id 
      JOIN msdb.dbo.sysschedules sched on jsched.schedule_id = sched.schedule_id 
      WHERE pack.packagetype = 6 
      AND jobs.enabled = 1 
      AND sched.enabled = 1 
      AND (CAST(YEAR(GETDATE()) AS bigint) * 100 + MONTH(GETDATE())) * 100 + DAY(GETDATE()) BETWEEN sched.active_start_date AND active_end_date 
      AND (CAST(DATEPART(HOUR,GETDATE()) AS bigint) * 100 + DATEPART(MINUTE,GETDATE())) * 100 + DATEPART(SECOND,GETDATE()) BETWEEN sched.active_start_time AND active_end_time 
    ) SysPackages 
     CROSS APPLY 
     SysPackages.PackageDataXml.nodes('/DTS:Executable/DTS:Executable/DTS:Executable') Nodes(Node) 
    WHERE 
     Nodes.node.value('@DTS:ExecutableType', 'varchar(200)') 
     LIKE 'Microsoft.SqlServer.Management.DatabaseMaintenance.DbMaintenanceReindexTask%'; 

(Этот запрос является результатом another SO question.)

ответ

0

Я не мог найти способ сделать IF EXISTS() непосредственно в отчете XQuery.

Однако можно вставить результаты XQuery в временную таблицу, а затем выполнить команду IF EXISTS() на основе содержимого таблицы temp.

IF OBJECT_ID('tempdb..#PlanResults') IS NOT NULL 
    DROP TABLE #PlanResults; 

CREATE TABLE #PlanResults (
    ExecutableType varchar(200), 
    ObjectName varchar(50) 
) 

;WITH XMLNAMESPACES 
    (
     'www.microsoft.com/SqlServer/Dts' AS DTS 
     ,'www.microsoft.com/SqlServer/Dts/Tasks' AS SQLTask) 

    INSERT INTO #PlanResults 

    SELECT 
     Nodes.node.value('(@DTS:ExecutableType)[1]', 'varchar(200)') AS ExecutableType, 
     Nodes.node.value('(DTS:Property[@DTS:Name="ObjectName"])[1]', 'varchar(50)') AS ObjectName 
    FROM 
     (
     SELECT 
      CAST(CAST([packagedata] as varbinary(max)) as xml) PackageDataXml 
     FROM [msdb].[dbo].[sysmaintplan_subplans] sub 
      JOIN msdb.dbo.sysssispackages pack on sub.plan_id = pack.id 
      JOIN msdb.dbo.sysssispackagefolders fold on pack.folderid = fold.folderid 
      JOIN msdb.dbo.sysjobs jobs on sub.job_id = jobs.job_id 
      JOIN msdb.dbo.sysjobschedules jsched on jobs.job_id = jsched.job_id 
      JOIN msdb.dbo.sysschedules sched on jsched.schedule_id = sched.schedule_id 
      WHERE pack.packagetype = 6 
      AND jobs.enabled = 1 
      AND sched.enabled = 1 
      AND (CAST(YEAR(GETDATE()) AS bigint) * 100 + MONTH(GETDATE())) * 100 + DAY(GETDATE()) BETWEEN sched.active_start_date AND active_end_date 
      AND (CAST(DATEPART(HOUR,GETDATE()) AS bigint) * 100 + DATEPART(MINUTE,GETDATE())) * 100 + DATEPART(SECOND,GETDATE()) BETWEEN sched.active_start_time AND active_end_time 
    ) SysPackages 
     CROSS APPLY 
     SysPackages.PackageDataXml.nodes('/DTS:Executable/DTS:Executable/DTS:Executable') Nodes(Node) 
    WHERE 
     Nodes.node.value('@DTS:ExecutableType', 'varchar(200)') LIKE 'Microsoft.SqlServer.Management.DatabaseMaintenance.DbMaintenanceReindexTask%'; 

IF EXISTS (SELECT ObjectName FROM #PlanResults) 
BEGIN 
    PRINT 'Take action here.' 
END 

IF OBJECT_ID('tempdb..#PlanResults') IS NOT NULL 
    DROP TABLE #PlanResults;