web-dev-qa-db-ja.com

powershellを使用して.sqlファイルを実行する方法は?

.sqlファイルがあります。 Powershellスクリプトを介して接続文字列の詳細を渡し、.sqlファイルを起動しようとしています。

検索していて、Invoke-sqlcmdに関連するコマンドレットを思いつきました。 SQLに対応するモジュールを見つけようとしていましたが、マシンにモジュールが見つかりませんでした。

モジュールを取得するためにマシンに何かをインストールする必要がありますか(マシンには既にSQL Server Management Studio 2008 R2があります)、またはPowershellを使用して.sqlファイルを実行する簡単な方法はありますか?

67
Samselvaprabu

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.
89
CB.

MSDNの SQLPSモジュールのインポート から引用

PowerShellからSQL Serverを管理する推奨方法は、sqlpsモジュールをWindows PowerShell 2.0環境にインポートすることです。

したがって、はい、Christianが詳述したAdd-PSSnapinアプローチを使用できますが、推奨されるsqlpsモジュールアプローチを評価することも役立ちます。

最も単純なケースは、SQL Server 2012を使用していることを前提としています:sqlpsがインストールに含まれているため、他のモジュール(通常は profileImport-Module sqlps経由。 Get-Module -ListAvailableを使用して、システムでモジュールが使用可能かどうかを確認できます。

SQL Server 2012がない場合は、Get-Module/Import-Moduleがモジュールディレクトリにsqlpsモジュールをダウンロードするだけです。それを見つける。不思議なことに、マイクロソフトはこのモジュールをダウンロードできるようにしましたnot!ただし、Chad Millerは必要な部分を親切にパッケージ化し、 このモジュールのダウンロード を提供しました。 ... Documents\WindowsPowerShell\Modulesディレクトリの下に解凍し、インポートを続行します。

モジュールアプローチとスナップインアプローチは同一ではないことに注意してください。スナップインをロードすると、Get-PSSnapinwithout-Registeredパラメーターを実行し、ロードしたもののみを表示する)SQLスナップインが表示されます。一方、sqlpsモジュールGet-PSSnapinをロードすると、ロードされたスナップインが表示されないため、スナップインを調べるだけでInvoke-Sqlcmdコマンドレットをテストするさまざまなブログエントリが偽陰性の結果をもたらす可能性があります。

2012.10.06更新

SqlpsモジュールとsqlpsミニシェルとSQL Serverスナップインの完全なストーリーについては、2部構成のミニシリーズをご覧ください SQL Server開発者とDBA向けの実用的なPowerShell 最近ある読者のコメントによると、Simple-Talk.comで公開され、問題の「混乱を解く」ことができました。 :-)

41
Michael Sorens
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
5
Brent

以下は、SQLスナップインを読み込むためにPowerShellプロファイルにある関数です。

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
    }
}
4
David Brabant

2008 Server 2008および2008 R2

Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100

2012および2014

Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location
0
emekm