janvier
2012
Le module powershell SQLPS introduit une serie de commandes powershell destinées à l’interaction avec les composants de la suite SQL Server et ce depuis SQL Server 2008.
Ce module permet aussi entre autre de naviguer au travers des objets se trouvant sur les differentes instances SQL Server comme au travers de fichiers en mode console.
Cela introduit des possibilités de scripting intéressantes car l’on peut profiter de la puissance de powershell pour réaliser ces scripts.
La commande Invoke-Sqlcmd, commande qui comme son nom peut déjà vous y avoir fait penser, permet d’invoquer des scripts tels qu’on pourrait le faire avec l’utilitaire Sqlcmd.
Vous pourrez découvrir la description (complète) de cette commande en tapant dans une invite de commande SQLPS (ou Powershell en ayant chargé le module adéquat – sur un serveur ou Denali a été installé: Import-Module sqlps -DisableNameChecking
) :
Get-Help Invoke-Sqlcmd
Pour des exemples rapides:
Get-Help Invoke-Sqlcmd -Examples
Ou pour la documentation exhaustive:
Get-Help Invoke-Sqlcmd -Full
Que faire avec cela ?
Voici 2 exemples:
Exporter le résultat d’une query dans un fichier csv:
Invoke-Sqlcmd -ServerInstance "WIN-QDRSKD4G3GP\SQL11" -Database Volume -Query "select * from volumetest" | export-csv "c:\temp\extract_ps.csv"
Ce que j’apprécie grandement, c’est la simplicité d’écriture.
Ce bout de code peut être placé tel quel dans le step d’un job de l’agent SQL Server (de type PowerShell) et être exécuté sans problème.
Ci-dessous un extrait du fichier généré:
#TYPE System.Data.DataRow
« id », »UniqueID »
« 1 », »9ea1edd1-0163-43c8-a12c-036329425f3f »
« 2 », »1b30db32-bf16-4eb6-9cb5-52abfde676d9″
« 3 », »cb568ce5-a853-48f2-95a5-63b84da0e137″
Vous remarquerez la première ligne, mentionnant le type de l’objet ayant ete exporté. Cela provient de la fonction export-xml qui permet de typer les objets exportés permettant par la suite de les réimporter tout en conservant les propriétés de l’objet source.
La seconde étant le nom des colonnes de la table exportée.
Et ensuite les différentes lignes exportées au format .csv.
Coté performances par contre il ne faut pas être pressé malheureusement!!!
Rien à voir avec BCP!
Voici la comparaison de vitesse pour une extraction via BCP et utilisant Invoke-Sqlcmd pour un volume de plus ou moins 150Mo:
On ne l’utilisera donc pas pour des exports massifs au quotidien si l’on souhaite de la vitesse.
Par contre pour un export one shot vite fait, si la volumétrie n’est pas trop importante, pourquoi pas!
Passons à l’exemple suivant..
Utiliser la commande dans un script:
Dans les billets précédents, je regardais comment extraire les informations des volumes de serveurs en se servant du powershell et de WMI.
Je me suis posé la question – et si la liste de serveurs provenait d’une table ?
Et voici la réponse:
| Add-Member -MemberType ScriptProperty -Name FreeSpaceinGB -Value {[math]::Round(($this.freespace / 1GB),2)} -PassThru `
| Add-Member -MemberType ScriptProperty -Name UsedSpaceinGB -Value {[math]::Round((($this.capacity - $this.freespace) / 1GB),2)} -PassThru `
| Add-Member -MemberType ScriptProperty -Name SizeinGB -Value {[math]::Round(($this.capacity / 1GB),2)} -PassThru `
| Add-Member -MemberType ScriptProperty -Name FreespacePercent -Value {[math]::Round(([int64]$this.freespace / [int64]$this.capacity * 100),2)} -PassThru `
| select __SERVER, Name, FreespaceinGB, UsedSpaceinGB, SizeinGB, FreespacePercent, BlockSize `
| export-csv "C:\Powershell\Disks\list.csv"