web-dev-qa-db-fra.com

Invoke-Sqlcmd incapable de s'exécuter

J'ai un script PowerShell qui vérifie le niveau de processeur du serveur sur lequel il s'exécute, puis s'il dépasse un certain seuil, il exécutera une procédure stockée SQL et un courrier électronique.

Le script s'exécute correctement sur mon serveur de développement avec la dernière version de PowerShell. Cependant, je rencontre des problèmes lors de l'exécution de Invoke-Sqlcmd commande sur le serveur en direct dont j'ai besoin pour obtenir les valeurs CPU. Par exemple, il peut être appelé LIVESERVER. Il exécute PowerShell 2.0 qui, je pense, est le problème:

Le terme "Invoke-Sqlcmd" n'est pas reconnu comme le nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme exploitable. Vérifiez l'orthographe du nom, ou si un chemin a été inclus, vérifiez que le chemin est correct et réessayez.

Je préfère ne pas apporter de modifications à ce serveur car il est critique pour l'entreprise (sauf si c'est une tâche facile pour mettre à jour PowerShell sans redémarrage, etc.).

Est-il possible d'exécuter mon script à partir de mon serveur de développement et de spécifier le serveur à partir duquel obtenir les données CPU? Je ne sais pas comment la syntaxe fonctionnerait pour y parvenir.

Voici mon script:

# Email 
$recipients = @("Ricky <[email protected]>")

# Loop 20 times
for ($i= 1; $i -le 20; $i++) {
    # Find CPU average usage percentage for given time period
    $cpuutil = (Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 20 |
               select -ExpandProperty countersamples |
               select -ExpandProperty cookedvalue |
               Measure-Object -Average).Average

    # Display average CP output
    $cpuutil

    # If CPU average percentage is higher than given value, run stored procedure and
    # e-mail to notify
    if ($cpuutil -ge 60) {
        Invoke-Sqlcmd -Query "SELECT * FROM [Vehicle].[dbo].[tblIndicator]" -ServerInstance "LIVESERVER"
    }

    if ($cpuutil -ge 60) {
        Send-MailMessage -From "[email protected]" -To $recipients -Body "SP Ran" -Subject "Stored Procedure" -Dno onSuccess, onFailure -SmtpServer 111.1.1.111
    } else {
        Start-Sleep -s 10
    }
}
8
Ricky

PowerShell v2 ne charge pas automatiquement les modules, vous devez donc charger vous-même les modules ou snapins appropriés:

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100

[ Source ]

5
Ansgar Wiechers

Cela devrait aider votre débogage!

if (-not (Get-Command Invoke-Sqlcmd -ErrorAction SilentlyContinue)) {
    Write-Error "Unabled to find Invoke-SqlCmd cmdlet"
}

if (-not (Get-Module -Name SqlServer | Where-Object {$_.ExportedCommands.Count -gt 0})) {
    Write-Error "The SqlServer module is not loaded"
}

if (-not (Get-Module -ListAvailable | Where-Object Name -eq SqlServer)) {
    Write-Error "Can't find the SqlServer module"
}

Import-Module SqlServer -ErrorAction Stop
8
gvee

Assurez-vous que vous avez installé le module Powershell avec SQL Server: enter image description here

Essayez ensuite d'importer le module SQLPS:

Import-Module SQLPS

Voir également: https://blogs.msdn.Microsoft.com/psssql/2008/09/02/sql-server-2008-management-tools-basic-vs-complete-explained/

7
Paweł Dyl

Si import-module échoue, vous devrez d'abord exécuter install-module. L'installation de SSMS ou SSDT n'inclut pas le module sqlserver par défaut.

install-module sqlserver
update-module sqlserver
import-module sqlserver
4
Brent