如何调整PowerShell代码单次调用Power BI API以规避速率限制
解决Power BI API速率限制导致的Keyblocker error问题
你的代码当前每读取一行SQL数据就调用一次Power BI API,频繁请求触发了API速率限制,这才出现了Keyblocker error。下面是修改后的代码,先把所有SQL数据批量存入数组,再仅调用一次API完成推送:
$dataSource = '******' #Server Name $userName = '******' #SQL User Name $password = '************' #SQL User Password $database = 'Production' #Database Name # 使用SQL Server认证的连接字符串 $connectionString ="Server=$dataSource;Database=$database;trusted_connection=false; user id =$userName;Password=$password;Integrated Security=False" $connection = New-Object System.Data.SqlClient.SqlConnection $connection.ConnectionString = $connectionString $connection.Open() $query = 'SELECT [data],[datetime], [id], [source_id] FROM [dbo].[vwResawLine2FPM]' $command = $connection.CreateCommand() $command.CommandText = $query $dataset = $command.ExecuteReader() $endpoint = "*****ENDPOINT*****" # 创建空数组,用来批量存储所有数据对象 $allPayloads = @() # 循环读取SQL数据,仅将对象存入数组 while ($dataset.Read()) { $payload = @{ "data" = $dataset['data'] "datetime" = $dataset['datetime'] "source_id" = $dataset['source_id'] "id" = $dataset['id'] } $allPayloads += $payload } # 一次性推送所有数据到Power BI if ($allPayloads.Count -gt 0) { $jsonBody = ConvertTo-Json $allPayloads -Depth 10 Invoke-RestMethod -Method Post -Uri $endpoint -Body $jsonBody -ContentType "application/json" } $connection.Close() $connection.Dispose()
核心修改说明:
- 新增
$allPayloads = @()空数组,专门批量存储所有SQL返回的数据对象 - 原while循环仅负责将每行数据转为对象并添加到数组,不再单独发起API请求
- 循环结束后,将整个数组转为JSON(指定
-Depth 10避免嵌套对象序列化失败),然后**仅调用一次Invoke-RestMethod**完成全部数据推送 - 补充
ContentType参数,确保Power BI能正确识别JSON格式的请求体
内容的提问来源于stack exchange,提问作者villasenorbritt
相关产品推荐
相关产品推荐

