【问题标题】:Apply IF EXISTS to the results of XQuery将 IF EXISTS 应用于 XQuery 的结果
【发布时间】:2014-02-16 16:05:43
【问题描述】:

我有一个 XQuery,用于检查 SQL Server 2008 R2 维护计划中是否存在重建索引任务。

如何将IF EXISTS 包裹起来,或者使用.exist XQuery 方法?我只想根据是否找到行从该查询中获取布尔值。

 ;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的结果。)

【问题讨论】:

    标签: sql xml tsql sql-server-2008-r2 xquery-sql


    【解决方案1】:

    我找不到直接在 XQuery 语句中执行 IF EXISTS() 的方法。

    但是,可以将 XQuery 的结果插入到临时表中,然后根据临时表的内容执行IF EXISTS()

    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;
    

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2022-01-17
      • 2016-10-28
      • 2017-06-23
      • 2016-11-28
      相关资源
      最近更新 更多