我们最近在 Windows Server 2012(从 Windows Server 2008 R2)上升级到 SQL Server 2012(从 SQL Server 2008 R2),以前运行没有错误的 SQL Server 作业代理作业现在失败了。
该作业有一个 Powershell 作业步骤:
$ErrorActionPreference = 'Stop'
$DateStamp = Get-Date -format "yyyyMMdd"
$BizUnit = 'SHB'
# Target File directory
$BaseDir = '\\MyFileServer\MyDirectory'
$Query = "EXEC dbo.usp_MyQuery '$BizUnit'"
$TargetFile = "MyTargetFile_" + $BizUnit + "_$DateStamp.xml"
$TargetDir = (Join-Path -Path $BaseDir -ChildPath $BizUnit)
$Query | Out-File -FilePath (Join-Path -Path $TargetDir -ChildPath $TargetFile) -Force -Encoding "utf8"
当作业运行时,它会失败并显示以下错误消息:
作业步骤在 PowerShell 脚本的第 14 行收到错误。对应的行是'$Query | Out-File -FilePath (Join-Path -Path $TargetDir -ChildPath $TargetFile) -Force -Encoding "utf8"'。更正脚本并重新安排作业。PowerShell返回的错误信息是:'Cannot perform operation because operation "ReportWrongProviderType" is invalid。删除操作“ReportWrongProviderType”,或调查其无效的原因。
当我搜索 interwebz 时,我找不到任何对“ReportWrongProviderType”的引用。关于 Out-File 调用有什么问题的任何想法?
问题是 PowerShell 会话默认使用 SqlServer 提供程序。我在 Out-File cmdlet 之前将此语句添加到脚本中:
这将提供程序更改为 FileSystem 提供程序,并允许 Out-File cmdlet 正确找到文件共享并创建文件。
本文对比了 SQLPS 在 SQL Server 2008 R2 与 SQL Server 2012/2014 中的加载方式。SQL Provider 在 SQL Server 2008 R2 中使用“Add-PSSnapin”cmdlet 加载,而从 SQL Server 2012 开始,使用“Import-Module”cmdlet。
作者指出:“加载模块的结果 [with 'Import-Module'] 只是更改为您刚刚加载的 PSDrive。” 显然,'Add-PSSnapin' cmdlet 使其 SQLPS 会话的提供程序保持不变(作为文件系统)。cmdlet 使用的变化以及由此产生的会话行为是导致我的问题的原因。