Вопрос по sql, sql-server – Как выполнить файл .sql, используя powershell?

67

У меня есть .sql файл. Я пытаюсь передать подробности строки подключения через скрипт Powershell и вызвать.sql файл.

Я искал и придумал командлет, связанный сInvoke-sqlcmd, Пока я пытался найти модуль, соответствующий SQL, я не нашел ни одного на моей машине.

Должен ли я установить что-либо на свой компьютер (на компьютере уже установлена SQL Server Management Studio 2008 R2), чтобы получить модули, или есть простой способ выполнить.sql файлы, использующие Powershell?

Ваш Ответ

5   ответов
41

Цитировать изИмпортируйте модуль SQLPS на MSDN,

The recommended way to manage SQL Server from PowerShell is to import the sqlps module into a Windows PowerShell 2.0 environment.

Так что да, вы можете использоватьAdd-PSSnapin подход подробно описан Кристианом, но также полезно оценить рекомендуемый подход модуля sqlps.

В простейшем случае предполагается, что у вас есть SQL Server 2012:sqlps включен в установку, так что вы просто загружаете модуль, как и любой другой (как правило, в вашемпрофиль) с помощьюImport-Module sqlps, Вы можете проверить, доступен ли модуль в вашей системе, с помощьюGet-Module -ListAvailable.

Если у вас нет SQL Server 2012, все, что вам нужно сделать, это загрузитьsqlps модуль в каталог ваших модулей, так что Get-Module / Import-Module найдет его. Любопытно, что Microsoft делаетnot сделать этот модуль доступным для скачивания! Тем не менее, Чед Миллер любезно упаковал необходимые детали и предоставилэтот модуль скачать, Разархивируйте его в папке ... Documents \ WindowsPowerShell \ Modules и продолжите импорт.

Интересно отметить, что модульный подход и подход оснастки не идентичны. Если вы загрузите оснастки, то запуститеGet-PSSnapin (without параметр -Registered, чтобы показать только то, что вы загрузили) вы увидите оснастки SQL. Если, с другой стороны, вы загружаете модуль sqlpsGet-PSSnapin не будет отображать загруженные оснастки, поэтому различные записи в блоге, которые проверяютInvoke-Sqlcmd Командлет, только проверяя оснастки, может давать ложноотрицательный результат.

2012.10.06 Update

Чтобы получить полную информацию о модуле sqlps и мини-оболочке sqlps и оснастках SQL Server, взгляните на мою мини-серию из двух частейПрактическая PowerShell для разработчиков SQL Server и администраторов баз данных недавно опубликованный на Simple-Talk.com, где я, согласно комментарию одного из читателей, успешно «де-запутался» проблема. :-)

Error: User Rate Limit ExceededInstall-Module -Name SqlServer
Get-Module -ListAvalableError: User Rate Limit ExceededGet-Module -ListAvailable.
Error: User Rate Limit Exceededdownload the SQLPS module from MSError: User Rate Limit ExceededPowerShellTools.msiError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
86

Попытайтесь увидеть, присутствуют ли оснастки 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.
Error: User Rate Limit Exceededstackoverflow.com/a/10923160/520612 ?? ;)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Samselvaprabu
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

Вот функция, которая есть в моем профиле PowerShell для загрузки оснасток 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
    }
}
0

с 2008 Server 2008 и 2008 R2

Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100

с 2012 и 2014

Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location
5
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

Похожие вопросы