首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Invoke-SqlCmd QueryTimeout

Invoke-SqlCmd QueryTimeout
EN

Stack Overflow用户
提问于 2012-10-31 15:00:54
回答 2查看 13K关注 0票数 1

有人知道如何将Invoke-SqlCmd QueryTimeout设置为大于65535吗?

微软表示,他们已经在德纳利修复了这个问题,但我们仍在使用带有最新服务包的SQL2008 R2。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-01 21:26:10

您可以编写自己版本的Invoke-SqlCmd,它直接使用System.Data.SqlClient对象,并可以使用它做任何您想做的事情。有一堆这样做的例子可以找到,包括invoke-sqlcmd2,它是专门为绕过QueryTimeout错误而编写的,托管在微软的脚本库中。如果您不想部署这样的脚本,只需将相关代码直接集成到备份脚本中即可。

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

票数 0
EN

Stack Overflow用户

发布于 2016-10-30 11:29:25

您可以使用下面的函数来自定义您自己的查询超时和会话超时限制(在定义参数时,您可以给出自己需要的值)

代码语言:javascript
复制
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]) } 
    } 

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13152809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档