【问题标题】:Invoke-SqlCmd QueryTimeout调用-SqlCmd QueryTimeout
【发布时间】:2012-10-20 14:35:34
【问题描述】:

有谁知道如何将 Invoke-SqlCmd QueryTimeout 设置为超过 65535?

Microsoft 表示他们已在 Denali 中修复此问题,但我们仍在使用带有最新服务包的 SQL 2008 R2。

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

基本上,我们正在尝试使用 powershell 备份或恢复数据库。我们的一些数据库非常大,因此完成这项工作需要超过 65535 个。

有人建议我们应该在 powershell 中使用带有超时的 ADO.NET。但我想知道我们是否有任何 Invoke-SqlCmd 的解决方法...

【问题讨论】:

  • 你确定要使用Invoke-SqlCmd吗?如果您无法将客户端升级到 SQL 2012,您可以尝试通过回退到直接使用 cmd /c 执行 SQLCMD 或使用 SMO 执行备份/恢复来解决此问题。
  • 将查询超时设置为零应该会导致它等待命令完成,无论需要多长时间。
  • 重要的是PS模块的版本,而不是服务器的版本。最新版本的 Windows/PowerShell 允许您使用 Update-Module SqlServer 和使用 -QueryTimeout 0

标签: sql-server sql-server-2008 powershell powershell-2.0


【解决方案1】:
Invoke-Sqlcmd -query 'select * from largeDb' -QueryTimeout 0 

-QueryTimeout 0 :将使您的 cmdlet 超时。

AFAIK 很快,这个错误就会得到解决。

【讨论】:

  • 从脚本添加索引时对我不起作用。仍然默认为 60 秒
  • 'IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_TableName_ColumnName') BEGIN CREATE NONCLUSTERED INDEX IX_TableName_ColumnName ON [dbo].[TableName] ([ColumnName]) INCLUDE ([ColumnName2] ,[ColumnName3]) END GO ' - 那是在我的 SQL 脚本中。
【解决方案2】:

您可以使用以下函数自定义您自己的查询超时会话超时限制(同时定义参数您可以给自己想要的值)

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]) } 
    } 

}

希望能有所帮助。

【讨论】:

    【解决方案3】:

    您可以编写自己的 Invoke-SqlCmd 版本,该版本直接使用 System.Data.SqlClient 对象并使用它做任何您想做的事情。有很多关于如何执行此操作的示例,包括 invoke-sqlcmd2,这是专门为绕过 QueryTimeout 错误而编写的,托管在 Microsoft 的脚本库中。如果您不想部署这样的脚本,您可以直接将相关代码集成到您的备份脚本中。

    或者,您应该能够使用 SMO 来备份数据库。 IIRC,querytimeout bug 不会影响 SMO。

    【讨论】:

    • SMO 查询超时(包括备份)默认为 10 分钟。如果你想要更长的时间,你需要设置它。
    • 嘿,6年后还有什么更好的吗? MS 已将 SQLPS 更新为 $moduleName = "SqlServer" ... Import-Module $moduleName -Verbose,但我仍然在 10MB dB 上超时。
    猜你喜欢
    • 2017-12-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    相关资源
    最近更新 更多