Как выполнить файл .sql с помощью powershell?
У меня есть файл. sql
. Я пытаюсь передать детали строки связи через Powershell script и вызывать файл .sql
.
Я искал и придумал командлет, связанный с Invoke-sqlcmd
. Пока я пытался найти модуль, соответствующий SQL, я не нашел его на своей машине.
Должен ли я установить что-либо на моем компьютере (у машины уже есть SQL Server Management Studio 2008 R2), чтобы получить модули или есть простой способ выполнить .sql
файлы с помощью Powershell?
Ответы
Ответ 1
Попробуйте увидеть, имеются ли оснастки 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.
Ответ 2
Цитата из Импортировать модуль 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 не делает этот модуль доступным для скачивания! Тем не менее, Чад Миллер любезно упаковал необходимые предметы и предоставил этот модуль загрузки. Распакуйте его под свой... Документы\WindowsPowerShell\Каталог модулей и продолжите импорт.
Интересно отметить, что модульный подход и подход snapin не идентичны. Если вы загрузите snapins, запустите Get-PSSnapin
(без параметра -Registered, чтобы показывать только то, что вы загрузили) вы увидите snapins SQL. Если, с другой стороны, вы загружаете модуль sqlps Get-PSSnapin
, он не будет показывать загруженные snapins, поэтому различные записи блога, которые проверяют командлет Invoke-Sqlcmd
, только проверяя snapins, могут давать ложный отрицательный результат.
2012.10.06 Обновление
Для получения полной информации о модуле sqlps и оснастке sqlps mini-shell vs. SQL Server загляните в мой двухсекционный мини-сериал Практическая PowerShell для разработчиков и администраторов баз данных SQL, недавно опубликованная на Simple-Talk.com, где я, согласно одному комментарию читателя, успешно "смутил" проблему.: -)
Ответ 3
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
Ответ 4
Вот функция, которая у меня есть в моем профиле PowerShell для загрузки snapins SQL:
function Load-SQL-Server-Snap-Ins
{
try
{
$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\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
}
}
Ответ 5
с 2008 Server 2008 и 2008 R2
Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100
с 2012 и 2014 годами
Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location