Как выполнить.sql-файл с помощью powershell?
у меня есть .. Я пытаюсь передать сведения о строке подключения через сценарий Powershell и вызвать .
Я искал и придумал командлет, связанный с Invoke-sqlcmd. Пока я пытался найти модуль, соответствующий SQL, я не нашел ни одного в своей машине.
должен ли я установить что-либо на своей машине (на машине уже есть SQL Server Management Studio 2008 R2), чтобы получить модули или есть ли простой способ выполнить .sql файлы с помощью Powershell?
5 ответов:
попробуйте проверить, присутствуют ли оснастки SQL:
get-pssnapin -Registered Name : SqlServerCmdletSnapin100 PSVersion : 2.0 Description : This is a PowerShell snap-in that includes various SQL Server cmdlets. Name : SqlServerProviderSnapin100 PSVersion : 2.0 Description : SQL Server ProviderЕсли так
Add-PSSnapin SqlServerCmdletSnapin100 # here lives Invoke-SqlCmd Add-PSSnapin SqlServerProviderSnapin100затем вы можете сделать что-то вроде этого:
invoke-sqlcmd -inputfile "c:\mysqlfile.sql" -serverinstance "servername\serverinstance" -database "mydatabase" # the parameter -database can be omitted based on what your sql script does.
цитирую импорт модуля SQLPS на MSDN,
рекомендуемый способ управления SQL Server из PowerShell-это импорт модуль sqlps в среде Windows PowerShell 2.0.
Да, да, вы могли бы использовать
Add-PSSnapinподход, подробно описанный Кристианом, но это также полезно, чтобы оценить рекомендуемая программа sqlps модульный подход.в простейшем случае предполагается, что у вас есть SQL Server 2012:sqlps входит в установку, поэтому вы просто загружаете модуль, как и любой другой (обычно в вашем профиль) через
Import-Module sqlps. Вы можете проверить, если модуль доступен в вашей системе сGet-Module -ListAvailable.если у вас нет SQL Server 2012, то все, что вам нужно сделать, это скачать sqlps модуль в каталог модулей, поэтому Get-Module / Import-Module найдет его. Любопытно, что Microsoft делает не сделать этот модуль доступен для скачивания! Однако, Чад Миллер любезно упаковал необходимые части и предоставил этот модуль скачать. Распакуйте его под вашим ...Каталог Documents\WindowsPowerShell\Modules и продолжить импорт.
интересно отметить, что модульный подход и подход snapin не идентичны. Если вы загружаете snapins, то запустите
Get-PSSnapin(без параметр-Registered, чтобы показать только то, что вы загрузили) вы увидите SQL snapins. Если, с другой стороны, вы загружаете модуль sqlpsGet-PSSnapinне будет показывать загруженные snapins, поэтому различные записи в блоге, которые проверяют дляInvoke-Sqlcmdкомандлет, только исследуя snapins, может дать ложный отрицательный результат.2012.10.06 обновление
за всю историю на модуль sqlps и программа sqlps мини-оболочки и оснастки SQL-сервера, посмотрите на мое двухсерийный мини-сериал практический PowerShell для разработчиков SQL Server и DBAs недавно опубликованным on Simple-Talk.com где я, согласно комментарию одного читателя, успешно "де-запутал" проблему. : -)
if(Test-Path "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS") { #Sql Server 2012 Import-Module SqlPs -DisableNameChecking C: # Switch back from SqlServer } else { #Sql Server 2008 Add-PSSnapin SqlServerCmdletSnapin100 # here live Invoke-SqlCmd } Invoke-Sqlcmd -InputFile "MySqlScript.sql" -ServerInstance "Database name" -ErrorAction 'Stop' -Verbose -QueryTimeout 1800 # 30min
вот функция, которая у меня есть в моем профиле PowerShell для загрузки SQL snapins:
function Load-SQL-Server-Snap-Ins { try { $sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps" if (!(Test-Path $sqlpsreg -ErrorAction "SilentlyContinue")) { throw "SQL Server Powershell is not installed yet (part of SQLServer installation)." } $item = Get-ItemProperty $sqlpsreg $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path) $assemblyList = @( "Microsoft.SqlServer.Smo", "Microsoft.SqlServer.SmoExtended", "Microsoft.SqlServer.Dmf", "Microsoft.SqlServer.WmiEnum", "Microsoft.SqlServer.SqlWmiManagement", "Microsoft.SqlServer.ConnectionInfo ", "Microsoft.SqlServer.Management.RegisteredServers", "Microsoft.SqlServer.Management.Sdk.Sfc", "Microsoft.SqlServer.SqlEnum", "Microsoft.SqlServer.RegSvrEnum", "Microsoft.SqlServer.ServiceBrokerEnum", "Microsoft.SqlServer.ConnectionInfoExtended", "Microsoft.SqlServer.Management.Collector", "Microsoft.SqlServer.Management.CollectorEnum" ) foreach ($assembly in $assemblyList) { $assembly = [System.Reflection.Assembly]::LoadWithPartialName($assembly) if ($assembly -eq $null) { Write-Host "`t`t($MyInvocation.InvocationName): Could not load $assembly" } } Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0 Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30 Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000 Push-Location if ((Get-PSSnapin -Name SqlServerProviderSnapin100 -ErrorAction SilentlyContinue) -eq $null) { cd $sqlpsPath Add-PsSnapin SqlServerProviderSnapin100 -ErrorAction Stop Add-PsSnapin SqlServerCmdletSnapin100 -ErrorAction Stop Update-TypeData -PrependPath SQLProvider.Types.ps1xml Update-FormatData -PrependPath SQLProvider.Format.ps1xml } } catch { Write-Host "`t`t$($MyInvocation.InvocationName): $_" } finally { Pop-Location } }
С 2008 Server 2008 и 2008 R2
Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100С 2012 и 2014
Push-Location Import-Module -Name SQLPS -DisableNameChecking Pop-Location
Comments