1

Invoke-SqlCmd QueryTimeoutを65535以上に設定する方法を知っている人はいますか?

Microsoftは、Denaliで修正したと述べていますが、最新のサービスパックでSQL2008R2を使用しています。

http://connect.microsoft.com/SQLServer/feedback/details/551799/invoke-sqlcmd-querytimeout-0-still-times-out

基本的に、PowerShellを使用してデータベースをバックアップまたは復元しようとしています。一部のデータベースは非常に大きいため、ジョブを完了するには65535以上かかります。

PowerShellでタイムアウト付きのADO.NETを使用する必要があるという提案もありました。しかし、Invoke-SqlCmdの回避策があるかどうか疑問に思います...

4

3 に答える 3

4
Invoke-Sqlcmd -query'select * from largeDb' -QueryTimeout 0

-QueryTimeout 0:コマンドレットがタイムアウトしないようにします。

AFAIK間もなく、このバグは解決されます。

于 2019-05-23T16:38:31.143 に答える
1

以下の関数を使用して、独自のクエリタイムアウトおよびセッションタイムアウトの制限をカスタマイズできます(パラメータを定義しながら、独自の目的の値を指定できます)

function Invoke-SqlCommand 
{ 
    [CmdletBinding()] 
    param( 
    [Parameter(Position=0, Mandatory=$true)] [string]$ServerInstance, 
    [Parameter(Position=1, Mandatory=$false)] [string]$Database, 
    [Parameter(Position=2, Mandatory=$false)] [string]$Query, 
    [Parameter(Position=3, Mandatory=$false)] [string]$Username, 
    [Parameter(Position=4, Mandatory=$false)] [string]$Password, 
    [Parameter(Position=5, Mandatory=$false)] [Int32]$QueryTimeout=600, 
    [Parameter(Position=6, Mandatory=$false)] [Int32]$ConnectionTimeout=15, 
    [Parameter(Position=7, Mandatory=$false)] [ValidateScript({test-path $_})] [string]$InputFile, 
    [Parameter(Position=8, Mandatory=$false)] [ValidateSet("DataSet", "DataTable", "DataRow")] [string]$As="DataRow" 
    ) 

    if ($InputFile) 
    { 
        $filePath = $(resolve-path $InputFile).path 
        $Query =  [System.IO.File]::ReadAllText("$filePath") 
    } 

    $conn=new-object System.Data.SqlClient.SQLConnection 

    if ($Username) 
    { $ConnectionString = "Server={0};Database={1};User ID={2};Password={3};Trusted_Connection=False;Connect Timeout={4}" -f $ServerInstance,$Database,$Username,$Password,$ConnectionTimeout } 
    else 
    { $ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerInstance,$Database,$ConnectionTimeout } 

    $conn.ConnectionString=$ConnectionString 

    #Following EventHandler is used for PRINT and RAISERROR T-SQL statements. Executed when -Verbose parameter specified by caller 
    if ($PSBoundParameters.Verbose) 
    { 
        $conn.FireInfoMessageEventOnUserErrors=$true 
        $handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {Write-Verbose "$($_)"} 
        $conn.add_InfoMessage($handler) 
    } 

    $conn.Open() 
    $cmd=new-object system.Data.SqlClient.SqlCommand($Query,$conn) 
    $cmd.CommandTimeout=$QueryTimeout 
    $ds=New-Object system.Data.DataSet 
    $da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd) 
    [void]$da.fill($ds) 
    $conn.Close() 
    switch ($As) 
    { 
        'DataSet'   { Write-Output ($ds) } 
        'DataTable' { Write-Output ($ds.Tables) } 
        'DataRow'   { Write-Output ($ds.Tables[0]) } 
    } 

}

それが役に立てば幸い。

于 2016-10-30T03:29:25.173 に答える
0

System.Data.SqlClientオブジェクトを直接使用する独自のバージョンのInvoke-SqlCmdを作成し、それを使ってやりたいことを何でも行うことができます。これを行う方法の例はたくさんあります。invoke-sqlcmd2は、QueryTimeoutバグを回避するために特別に作成されており、Microsoftのスクリプトギャラリーでホストされています。このようなスクリプトを展開したくない場合は、関連するコードをバックアップスクリプトに直接統合できます。

または、SMOを使用してデータベースをバックアップできる必要があります。IIRC、querytimeoutのバグはSMOに影響しません。

于 2012-11-01T13:26:09.853 に答える