78

私は持っています。sqlファイル。Powershellスクリプトを介して接続文字列の詳細を渡し、.sqlファイルを呼び出そうとしています。

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

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

4

6 に答える 6

96

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.
于 2012-06-05T10:09:43.637 に答える
44

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

PowerShellからSQLServerを管理するための推奨される方法は、sqlpsモジュールをWindowsPowerShell2.0環境にインポートすることです。

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

最も単純なケースは、SQL Server 2012があることを前提としています。sqlpsはインストールに含まれているため、を介して他のモジュールと同じように(通常はプロファイルに)モジュールをロードするだけImport-Module sqlpsです。モジュールがシステムで使用可能かどうかは、を使用して確認できますGet-Module -ListAvailable

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

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

2012.10.06更新

sqlpsモジュールとsqlpsミニシェルとSQLServerスナップインの詳細については、Simple-Talk.comで最近公開されたSQLServer開発者とDBA向けの2部構成のミニシリーズPracticalPowerShellをご覧ください。ある読者のコメントによると、私はこの問題をうまく「混乱させない」ようにしています。:-)

于 2012-06-06T22:21:17.477 に答える
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
于 2013-09-11T17:27:54.893 に答える
4

これは、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
    }
}
于 2013-09-12T11:30:40.537 に答える
2

これは、追加のツール/セットアップ/PowerShellアドオンを必要としない単純なスクリプトの軽量アプローチです。

$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = $connectionStringGoesHere
$conn.Open()
$content = Get-Content $scriptFileNameGoesHere
$cmds = New-Object System.Collections.ArrayList
$cmd = ""
$content | foreach {
    if ($_.Trim() -eq "GO") { $cmds.Add($cmd); $cmd = "" } 
    else { $cmd =  $cmd + $_ +"`r`n" }
}
$cmds | foreach {
    $sc = New-Object System.Data.SqlClient.SqlCommand 
    $sc.CommandText = $_
    $sc.Connection = $conn
    $sc.ExecuteNonQuery()
}
于 2021-03-08T20:44:26.243 に答える
1

2008Server2008および2008R2を使用

Add-PSSnapin -Name SqlServerCmdletSnapin100, SqlServerProviderSnapin100

2012年と2014年

Push-Location
Import-Module -Name SQLPS -DisableNameChecking
Pop-Location
于 2016-03-04T16:30:31.157 に答える