Domanda

I have an XQuery that checks for the existence of Rebuild Index tasks in SQL Server 2008 R2 maintenance plans.

How do I wrap an IF EXISTS around this, or use the .exist XQuery method? I just want to get a boolean from this query based on whether rows were found.

 ;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%';

(The above query is a result of another SO question.)

È stato utile?

Soluzione

I couldn't find a way to do an IF EXISTS() directly within the XQuery statement.

However, it is possible to insert the results of the XQuery into a temp table, and then perform an IF EXISTS() based on the contents of the temp table.

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top