[英]SQL XQuery and Cross Apply problems…too many rows in results
[英]Apply IF EXISTS to the results of XQuery
我有一个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%';
(以上查询是另一个SO问题的结果。)
我找不到直接在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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.