Як виконати файл .sql за допомогою PowerShell?


74

Я маю . sqlфайл. Я намагаюся передати деталі рядка з'єднання через скрипт Powershell і викликати .sqlфайл.

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

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

Відповіді:


93

Спробуйте перевірити, чи є оснастки 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.

5
Додатком до цього для SQL Server 2012 є використання SqlServerCmdletSnapin110 та SqlServerProviderSnapin110 для реєстрації.
MCRohith

@MCRohith: Дякуємо за додану вартість. Дійсно корисна інформація
Самсельвапрабу

2
Просто FYI, оскільки, напевно, багато людей натрапляють на це питання. З новішими версіями SQL вони мають sqlps. Ви можете просто додати Модуль імпорту “sqlps” -DisableNameChecking до свого сценарію
робочий байт

1
@workabyte Чи читали ви цю відповідь нижче: stackoverflow.com/a/10923160/520612 ?? ;)
CB.

1
PSA: Для нових версій PowerShell ви можете спробувати Imoprt-Module SQLPSзамість цього або Get-Module -List | ? Name -eq sqlpsперевірити, чи є у вас один або кілька модулів SQLPS, доступних для імпорту.
qJake

43

Посилання з Імпортування модуля 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 не ідентичні. Якщо ви завантажите оснастки, а потім запустите Get-PSSnapin( без параметра -Registered, щоб показати лише те, що ви завантажили), ви побачите модулі SQL. Якщо, з іншого боку, ви завантажуєте модуль sqlps Get-PSSnapin, не відображатимуться завантажені оснастки, тому різні записи в блозі, які перевіряють Invoke-Sqlcmdкомандлет, лише перевіряючи оснастки, можуть давати помилково негативний результат.

2012.10.06 Оновлення

Щоб отримати повну історію про модуль sqlps проти міні-оболонки sqlps проти оснасток SQL Server, погляньте на мою міні-серію з двох частин Практична PowerShell для розробників SQL Server та DBA, нещодавно опубліковану на Simple-Talk.com де я, згідно з коментарем одного читача, успішно "розплутав" проблему. :-)


3
Зверніть увагу, що тепер ви можете завантажити модуль SQLPS з MS ; з PowerShellTools.msi, існують версії x86 і x64.
thomasb

Get-Module -ListAvalable>> правильна команда Get-Module -ListAvailable.
wut-excel

Щоб використовувати PowerShell із SSMS 17 або пізнішої версії, встановіть її з галереї PowerShell зInstall-Module -Name SqlServer
LeBleu

7
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 для завантаження модулів 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.