我试图通过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
}
答案 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数据库时遇到了同样的问题。你可以试试这个
New-AzureRmAutomationAccount -ResourceGroupName $resourceGroupName -Name $automationAccountName -Location $location
Set-AzureRmAutomationAccount -Name $automationAccountName -ResourceGroupName $resourceGroupName
这里我们已准备好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()
}
}
Import-AzureRMAutomationRunbook -Name $runBookName -Path $scriptPath -ResourceGroupName $resourceGroupName -AutomationAccountName $automationAccountName -Type PowerShell
我希望这会有所帮助。而不是像使用Invoke-Sqlcmd那样使用我在Runbook中提供的$MasterDatabaseCommand.ExecuteNonQuery()
。它会起作用