You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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内容,再传递给作业步骤:

  1. 在作业中创建字符串类型变量@FilePath
  2. 添加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. 后续作业步骤即可使用更新后的命令输出文件名。

方案3:通过SSIS包处理事件数据

若环境中部署了SSIS,可将作业步骤改为调用SSIS包,在包内通过WMI数据源捕获事件,再解析PartComponent属性提取文件名,这种方式灵活性更高。

注意事项

  • SQL Server 2016的Agent WMI令牌不支持嵌套属性访问,必须通过上述方式绕开限制。
  • 确保SQL Server Agent服务账号具备目标文件夹的WMI访问权限,否则无法正常读取事件数据。

内容的提问来源于stack exchange,提问作者Tiago Gomes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:12:34