Sql-Server

使用外部 Powershell 的 SQL Server 作業

  • February 16, 2017

我有一個執行一些 Powershell 程式碼的 SQL Server 作業,但是雖然在機器上的 PS 編輯器中執行 Powershell 腳本時它執行成功,但是當使用相同的程式碼執行 SQL 代理作業時它會失敗。

它失敗的原因是因為它沒有設法添加一些管理單元,比如下面的一個或包含一​​些程序集。

Add-PSSnapin SqlServerCmdletSnapin100

這讓我相信 SQL Server 安裝了一個內部版本的 Powershell,它使用它執行 Powershell 作業。並且 Powershell 的特定內部版本較舊,並且沒有所需的程序集/管理單元,因此失敗。

現在,有什麼方法可以使用我機器上安裝的 Powershell 版本,而不是 SQL Server 內置的版本?

我已經查看了 SQL Server 中的“代理”,但我認為它們不是我想要的。

任何幫助表示讚賞!

根據要求,這是該過程的範例。不過,這一步應該是這樣的

作業步驟命令 將步驟設置為 cmdexec 作業,然後通過該作業執行 powershell。它允許您使用最新版本的 powershell 以及為該使用者配置 powershell 環境(如果需要)。step 命令將如下所示,並帶有範例的參數。請記住在包含空格的字元串周圍加上引號。

Powershell.exe -noprofile -executionpolicy bypass -file “C:\Scripts\DailyRestoreScript.ps1” -Arguments -SourceSQLInstance ’localhost\jdf2016’ -SourceDatabaseName ‘AdventureWorks’ -TargetSQLInstance ’localhost\jdf2016’ -TargetDatabaseName ‘AdventureWorks2’

完成工作

USE [msdb]
GO

/****** Object:  Job [DailyRestore_ADWorks]    Script Date: 2/16/2017 9:00:51 AM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]    Script Date: 2/16/2017 9:00:51 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'DailyRestore_ADWorks', 
       @enabled=1, 
       @notify_level_eventlog=0, 
       @notify_level_email=0, 
       @notify_level_netsend=0, 
       @notify_level_page=0, 
       @delete_level=0, 
       @description=N'Daily restore AD Works from backup', 
       @category_name=N'[Uncategorized (Local)]', 
       @owner_login_name='XXXXX\JFite', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [Restore ADWorks]    Script Date: 2/16/2017 9:00:51 AM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Restore ADWorks', 
       @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 -noprofile -executionpolicy bypass -file "C:\Scripts\DailyRestoreScript.ps1" -Arguments -SourceSQLInstance ''localhost\jdf2016'' -SourceDatabaseName ''AdventureWorks'' -TargetSQLInstance ''localhost\jdf2016'' -TargetDatabaseName ''AdventureWorks2''', 
       @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

引用自:https://dba.stackexchange.com/questions/148317