Вопрос по sql-server – Powershell запускает задание SQL, откладывает, затем запускает следующее

2

Я пишу сценарий Powershell, который делает несколько вещей с локальной базой данных SQL Server.

Я выполняю несколько заданий SQL, одно за другим. Я запускаю их так:

 sqlcmd -S .\ -Q "EXECUTE msdb.dbo.sp_start_job @job_name = 'Rebuild Content Asset Relationship Data'"

Есть ли способ заставить Powershell отложить выполнение следующего задания до завершения первого?

Спасибо

Это правильно. Это начинается и в конечном итоге завершается. Как и что мне опрашивать каждые несколько секунд? Это лучший способ сделать это? есть только флаг, который я могу добавить в SQLcmd? user952342
Майк: это не ждет. Как только вы выполните команду, она вернется через 0,001 секунды с этим:Job 'Rebuild Content Asset Relationship Data' started successfully. user952342
Вы имеете в виду задержку на несколько секунд? Или делаетsqlcmd не ждать, пока sproc будет сделан, прежде чем он выйдет? Mike Christensen
Быстрый Google обнаружил это:interworks.com/blogs/bbickell/2010/01/15/… - Может быть, завернуть все это в sproc, который запускает работу, а затем зацикливается, пока работа не будет завершена. Тогда позвони из Powershell .. Mike Christensen
Итак, ваш запрос технически завершается, он просто запускает некоторый фоновый процесс в SQL Server. Вопрос в том, как Powershell узнает, когда завершится какой-нибудь процесс SQL Server? Может быть, вы можете опрашивать каждые х секунд, чтобы проверить, сделано ли это еще? Mike Christensen

Ваш Ответ

4   ответа
1

Start-Sleep -seconds <nn> между вызовами sqlcmd.exe.

Error: User Rate Limit Exceeded user952342
0

твующий хранимый процесс (или операторы SQL) непосредственно из сценария PowerShell, либо реализуете что-то в соответствии с объяснением.Вот.

1

чтобы обернуть вашу работу в новый sproc, который начинает работу, а затем ожидает ее завершения, постоянно опрашивая свой статус. Отприкрепленная статьяВы можете сделать что-то вроде этого:

DECLARE @JobStatus INT
SET @JobStatus = 0
EXEC MSDB.dbo.sp_start_job @Job_Name = 'JobName'
SELECT @JobStatus = current_execution_status  FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 
                          'EXEC MSDB.dbo.sp_help_job @job_name = ''JobName'', @job_aspect = ''JOB'' ')     
WHILE @JobStatus <> 4
BEGIN   
    SELECT @JobStatus = current_execution_status  FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 
                                'EXEC MSDB.dbo.sp_help_job @job_name = ''JobName'', @job_aspect = ''JOB'' ')    
END

Тогда, вместо того, чтобы звонитьsp_start_job из командной строки вызовите sproc из командной строки, и PowerShell будет заблокирован, пока этот sproc не завершится. Надеюсь это поможет!

11

вы можете использовать SMO:

EDIT: Thinking on efficiency if you are going to add this function to your script I would take the SMO loading out and just place it near the top of your script (prior to this function). It will probably slow your script down if every time you call the function it reloads the assembly.


Function Get-SQLJobStatus
{
    param ([string]$server, [string]$JobName)
    # Load SMO assembly, and if we're running SQL 2008 DLLs load the SMOExtended and SQLWMIManagement libraries
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

    # Create object to connect to SQL Instance
    $srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $server

    # used to allow piping of more than one job name to function
    if($JobName)
    {
        foreach($j in $jobName)
        {
            $srv.JobServer.Jobs | where {$_.Name -match $JobName} | Select Name, CurrentRunStatus
        }
    }
    else #display all jobs for the instance
    {
        $srv.JobServer.Jobs | Select Name, CurrentRunStatus
} #end of Get-SQLJobStatus
}

Пример использования этой функции:


#will display all jobs on the instance
Get-SQLJobStatus MyServer

#pipe in more than one job to get status
"myJob","myJob2" | foreach {Get-SQLJobStatus -Server MyServer -JobName $_}

#get status of one job
Get-SQLJobStatus -Server MyServer -JobName "MyJob"

Вы можете использовать эту функцию в своем скрипте и просто несколько раз вызывать ее во время цикла или чего-то подобного, пока ваш статус работы не покажет & quot; Idle & quot ;. По крайней мере, в моей голове это то, что я думаю, может работать :)

Error: User Rate Limit Exceeded user952342
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user952342
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user952342

Похожие вопросы