AzureSQL多个Invoke-SQLCmd循环和连接错误

时间:2018-05-11 19:42:42

标签: powershell azure-sql-database azure-automation invoke-sqlcmd

我试图通过Azure自动化为多个AzureSQL数据库循环调用invoke-sqlcmd。循环中的第一个项目执行,但所有其余项目都以:

失败
  

Invoke-Sqlcmd:发生了与网络相关或特定于实例的错误   同时建立与SQL Server的连接。服务器不是   发现或无法访问。验证实例名称是否正确   并且SQL Server配置为允许远程连接。   (提供者:命名管道提供者,错误:40 - 无法打开   连接到SQL Server)

我猜我需要在执行下一个调用之前关闭第一个invoke-sqlcmd的连接,但是没有找到使用invoke-sqlcmd实现它的直接方法。这是我的循环:

const range: momentRange.DateRange = new momentRange.DateRange(new Date(2018, 0, 11), new Date(2018, 11, 30));
const it0: Iterable<moment.Moment> = range.by('days');

for (const day of it0) {
  // do something with each day
}

3 个答案:

答案 0 :(得分:2)

您可以尝试将每个连接设为powershell job。这解决了我前段时间非常类似的问题。 Send-MailMessage closes every 2nd connection when using attachments如果您想阅读解释。基本上,如果您无法使用.Close()方法,则可以通过终止每次运行的整个会话来强制关闭。在一个理想的世界中,cmdlet可以为您处理所有这些,但并非所有内容都是完美创建的。

# Loop through the datatable using the values per column 
$table | ForEach-Object {

# Set loop variables as these are easier to pass then $_.
$azureSQLDatabaseName = $_.dbname

# Execute SQL Query Against Azure SQL
$azureSQLServerName = $azureSQLServerName + ".database.windows.net"
$Cred = Get-AutomationPSCredential -Name $azureSQLCred

# Pass in the needed parameters via -ArgumentList and start the job.
Start-Job -ScriptBlock { Write-Output $(Invoke-Sqlcmd -ServerInstance $args[0] -Username $args[1].UserName -Password $args[1].GetNetworkCredential().Password -Database $args[0] -Query "SELECT * FROM INFORMATION_SCHEMA.TABLES " -QueryTimeout 65535 -ConnectionTimeout 60 -Verbose) 4>&1 } -ArgumentList $azureSQLServerName, $Cred | Wait-Job | Receive-Job

}

这是未经测试的,因为我没有要连接的服务器,但也许你可以通过一些工作来制作它。

答案 1 :(得分:1)

似乎您将.database.windows.net附加到循环中的服务器名称 。我猜这就是为什么它只适用于第一次迭代。

移动这一行:

$azureSQLServerName = $azureSQLServerName + ".database.windows.net"

在此之前:

$table | ForEach-Object {

答案 2 :(得分:1)

我在使用azure sql数据库时遇到了同样的问题。你可以试试这个

1。创建自动化帐户

New-AzureRmAutomationAccount -ResourceGroupName $resourceGroupName -Name $automationAccountName -Location $location

2。设置自动化帐户以使用

Set-AzureRmAutomationAccount -Name $automationAccountName -ResourceGroupName $resourceGroupName

3。创建/导入Runbook

这里我们已准备好Runbook,因此我们将其导入。这是Runbook代码

workflow runbookNameValue
{
    inlinescript
    {
        $MasterDatabaseConnection = New-Object System.Data.SqlClient.SqlConnection
        $MasterDatabaseConnection.ConnectionString = "ConnectionStringValue"

        # Open connection to Master DB
        $MasterDatabaseConnection.Open()

        # Create command
        $MasterDatabaseCommand = New-Object System.Data.SqlClient.SqlCommand
        $MasterDatabaseCommand.Connection = $MasterDatabaseConnection
        $MasterDatabaseCommand.CommandText = "Exec stored procedure"

        # Execute the query
        $MasterDatabaseCommand.ExecuteNonQuery()

        # Close connection to Master DB
        $MasterDatabaseConnection.Close() 
    }
}

4。导入

Import-AzureRMAutomationRunbook -Name $runBookName -Path $scriptPath -ResourceGroupName $resourceGroupName -AutomationAccountName $automationAccountName -Type PowerShell

我希望这会有所帮助。而不是像使用Invoke-Sqlcmd那样使用我在Runbook中提供的$MasterDatabaseCommand.ExecuteNonQuery()。它会起作用