Atualizamos recentemente para o SQL Server 2012 (do SQL Server 2008 R2) no Windows Server 2012 (do Windows Server 2008 R2) e um trabalho do SQL Server Job Agent que estava sendo executado anteriormente sem erros agora está falhando.
O trabalho tem uma etapa de trabalho do 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"
Quando o trabalho é executado, ele falha com esta mensagem de erro:
Uma etapa de trabalho recebeu um erro na linha 14 em um script do PowerShell. A linha correspondente é '$Query | Out-File -FilePath (Join-Path -Path $TargetDir -ChildPath $TargetFile) -Force -Encoding "utf8"'. Corrija o script e reprograme o trabalho. As informações de erro retornadas pelo PowerShell são: 'Não é possível executar a operação porque a operação "ReportWrongProviderType" é inválida. Remova a operação "ReportWrongProviderType" ou investigue por que ela não é válida.
Não consigo encontrar nenhuma referência a "ReportWrongProviderType" quando pesquiso o interwebz. Alguma ideia sobre o que há de errado com a chamada Out-File?
O problema é que a sessão do PowerShell está usando o provedor SqlServer por padrão. Adicionei esta instrução ao script antes do cmdlet Out-File:
Isso alterou o provedor para o provedor FileSystem e permitiu que o cmdlet Out-File encontrasse corretamente o compartilhamento de arquivo e criasse o arquivo.
Este artigo compara como o SQLPS é carregado no SQL Server 2008 R2 em comparação com o SQL Server 2012/2014. O SQL Provider é carregado usando o cmdlet 'Add-PSSnapin' no SQL Server 2008 R2, ao iniciar com o SQL Server 2012, o cmdlet 'Import-Module' é usado.
O autor afirma: "O resultado do carregamento do módulo [com 'Import-Module'] é simplesmente mudar para o PSDrive que você acabou de carregar." Evidentemente, o cmdlet 'Add-PSSnapin' deixou o provedor para sua sessão SQLPS inalterado (como FileSystem). Essa mudança no uso do cmdlet e o comportamento da sessão resultante foi o que causou meu problema.