如何在SQL Server Agent中通过WMI令牌获取触发事件的文件名?
SQL Server Agent作业中获取WMI事件触发文件名的解决方法
SQL Server Agent的WMI令牌缺乏详尽的官方文档,但针对你遇到的问题,可通过以下方案解决:
核心问题
你当前使用的__InstanceOperationEvent返回的TargetInstance为Cim_DirectoryContainsFile对象,而PartComponent是指向Win32_LogicalFile的WMI路径。SQL Server Agent的WMI令牌不支持嵌套属性访问(如TargetInstance.PartComponent),这是导致你尝试的几种方式报错的原因。
可行方案
方案1:修改WMI警报查询,直接返回文件名
将原WMI查询改为直接监听文件对象的事件,这样可直接通过令牌提取文件名:
SELECT FileName, Extension FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_LogicalFile' AND TargetInstance.Directory='D:\\SSIS\\INSUMOS\\RELATORIO_RECEITA_PC'
随后在作业步骤中使用以下语句获取完整文件名:
SELECT '$(ESCAPE_SQUOTE(WMI(FileName))).$(ESCAPE_SQUOTE(WMI(Extension)))'
方案2:在作业步骤中解析PartComponent路径(保留原查询)
若必须保留原Cim_DirectoryContainsFile事件查询,可通过PowerShell脚本解析PartComponent内容,再传递给作业步骤:
- 在作业中创建字符串类型变量
@FilePath - 添加PowerShell类型的作业步骤,执行以下脚本(替换你的作业名):
$wmiQuery = "SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE TargetInstance ISA 'Cim_DirectoryContainsFile' AND TargetInstance.GroupComponent='Win32_Directory.Name=''D:\\SSIS\\INSUMOS\\RELATORIO_RECEITA_PC'''" $event = Get-WmiObject -Query $wmiQuery -Namespace root\cimv2 $filePath = [System.Management.ManagementPath]::new($event.TargetInstance.PartComponent) $fileName = "$($filePath.FileName).$($filePath.Extension)" sqlcmd -S $(ESCAPE_SQUOTE(SRVR)) -Q "EXEC msdb.dbo.sp_update_jobstep @job_name='你的作业名称', @step_id=2, @command=N'SELECT ''$fileName'''" - 后续作业步骤即可使用更新后的命令输出文件名。
方案3:通过SSIS包处理事件数据
若环境中部署了SSIS,可将作业步骤改为调用SSIS包,在包内通过WMI数据源捕获事件,再解析PartComponent属性提取文件名,这种方式灵活性更高。
注意事项
- SQL Server 2016的Agent WMI令牌不支持嵌套属性访问,必须通过上述方式绕开限制。
- 确保SQL Server Agent服务账号具备目标文件夹的WMI访问权限,否则无法正常读取事件数据。
内容的提问来源于stack exchange,提问作者Tiago Gomes
相关产品推荐
相关产品推荐

