To będzie krótki wpis…
Jeśli planujesz wykorzystywać SMO , to swój skrypt zawsze musisz rozpocząć od załadowania odpowiednich bibliotek .NET. Pamiętanie nazw tych bibliotek jest… uciążliwe, więc jeśli już decydujesz się używać SMO to prawdopodobnie swoje skrypty rozpoczniesz od kilku instrukcji LoadAssembly np.:
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")
Ale można prościej. Pod adresem https://github.com/rbellamy/WindowsPowerShell/blob/master/Scripts/pssql-smo.ps1 znajduje się skrypt, który ładowanie bibliotek wykona za ciebie i na dodatek zrobi to w inteligentny sposób, kontrolując między innymi błędy do których mogło po drodze dojść. W swoim skrypcie wystarczy tylko dodać instrukcję wywołującą ten skrypt (w bieżącej powłoce PowerShell więc z kropką na początku):
. \library\pssql-smo.ps1
Poniżej wklejam oryginalny skrypt- ale zaznaczam – aktualną wersję znajdziesz pod wskazanym wcześniej adresem
# # Loads the SQL Server Management Objects (SMO) #
$ErrorActionPreference = "Stop"
$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"
if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue") { throw "SQL Server Provider for Windows PowerShell is not installed." } else { $item = Get-ItemProperty $sqlpsreg $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path) }
$assemblylist = "Microsoft.SqlServer.Management.Common", "Microsoft.SqlServer.Smo", "Microsoft.SqlServer.Dmf ", "Microsoft.SqlServer.Instapi ", "Microsoft.SqlServer.SqlWmiManagement ", "Microsoft.SqlServer.ConnectionInfo ", "Microsoft.SqlServer.SmoExtended ", "Microsoft.SqlServer.SqlTDiagM ", "Microsoft.SqlServer.SString ", "Microsoft.SqlServer.Management.RegisteredServers ", "Microsoft.SqlServer.Management.Sdk.Sfc ", "Microsoft.SqlServer.SqlEnum ", "Microsoft.SqlServer.RegSvrEnum ", "Microsoft.SqlServer.WmiEnum ", "Microsoft.SqlServer.ServiceBrokerEnum ", "Microsoft.SqlServer.ConnectionInfoExtended ", "Microsoft.SqlServer.Management.Collector ", "Microsoft.SqlServer.Management.CollectorEnum", "Microsoft.SqlServer.Management.Dac", "Microsoft.SqlServer.Management.DacEnum", "Microsoft.SqlServer.Management.Utility"
foreach ($asm in $assemblylist) { $asm = [Reflection.Assembly]::LoadWithPartialName($asm) }
Push-Location cd $sqlpsPath update-FormatData -prependpath SQLProvider.Format.ps1xml Pop-Location