SQL 代理 PowerShell 任務永遠不會完成
我對 PowerShell 很陌生,現在我找到了 dbatools.io,我想在其中執行 SQL 代理中的 PowerShell 任務,例如
$ExportPath = $env:TEMP + '\DriveSpace.csv' $datatable = Import-Csv $ExportPath | Out-DbaDataTable Write-DbaDataTable -SqlServer MyServer -Database Utils -InputObject $datatable -Table dbo.FreeSpaceOnDiskDrive -AutoCreateTable
它開始了,但它永遠不會結束。我也嘗試過執行以下任務:
Get-DbaDatabaseSpace -SqlServer MyServer -IncludeSystemDBs | Out-DbaDataTable | Write-DbaDataTable -SqlServer MyServer -database utils -Table dbo.DiskSpaceExample -AutoCreateTable
同樣的問題。它在 Windows PowerShell ISE 中執行正常,但只是掛在 SQL 代理中。所以現在它為我創建了一個新表,並用數據填充了它,但工作只是繼續執行。
您遇到的問題是 SQL Server 代理中的 PowerShell 子系統。由於您被置於 SQL Server PowerShell 提供程序 (SQLPS.exe) 的上下文中,因此使用其他模組有點不穩定。因此,它的工作方式與您打開
sqlps.exe
然後嘗試執行程式碼的方式相同。使用dbatools模組要記住的一件事是,它將與 SQLPS 和
sqlserver
MS 現在為 SQL Server 單獨維護的模組發生衝突。最後我檢查了它與之衝突的主要內容是我們現在在模組中擁有的 TEPP,它只是無法載入該程式碼。$$ Caveat: I’m a major contributor to this module. $$ dbatools 模組具有內置的自定義類型和样式,因此當您在也具有 SQLPS 或導入 SQLServer 模組的 PowerShell 主機下執行腳本時,您的結果會有所不同。
要在 SQL 代理步驟中使用 dbatools,請確保您只使用 CmdExec 子系統(步驟類型),然後呼叫 PowerShell 主機來執行您的程式碼。如果您不想為每個腳本維護一個文件,您可以按照下面說明的方式將程式碼放在 SQL 代理 CmdExec 步驟中,但更複雜的腳本更容易通過文件維護。
USE [msdb] GO /****** Object: Job [dbatools_example] Script Date: 2017-08-30 8:53:15 AM ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 2017-08-30 8:53:15 AM ******/ IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'dbatools_example', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'No description available.', @category_name=N'[Uncategorized (Local)]', @owner_login_name=N'sa', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [dbatools_command] Script Date: 2017-08-30 8:53:15 AM ******/ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'dbatools_command', @step_id=1, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'CmdExec', @command=N'powershell.exe -ExecutionPolicy Bypass -Command "Import-Module dbatools; $server = ''manatarms''; Get-DbaDatabaseSpace -SqlInstance $server -IncludeSystemDbs | Out-DbaDataTable | Write-DbaDataTable -SqlInstance $server -Database db1 -Table dbo.FreeSpaceOnDiskDrive -AutoCreateTable"', @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO
執行上面的工作在我的數據庫和表中給了我這個
db1.dbo.FreeSpaceOnDiskDrive