For my use case, I had to:
1. Load a SQL table/view to a collection
2. Record user updates in collection
3. Insert updated records to SQL
The challenge I faced was the slow performance of ForAll and Patch commands when used with SQL. This is the standard method outlined in Power Apps reference documentation, but I couldn’t get it to work in scale.
To illustrate this point, I created a sample Power App and connected it to [SalesLT].[SalesOrderDetail] table in AdventureWorks database.

Combining SQL with For Loop for Maximum Pain
ForAll / Patch Command
ForAll(
c_sales_order_detail,
Patch(
'[PA].[SalesOrderDetail]',
Defaults('[PA].[SalesOrderDetail]'),
{
SalesOrderID: SalesOrderID,
SalesOrderDetailID: SalesOrderDetailID,
OrderQty: OrderQty,
ProductID: ProductID,
UnitPrice: UnitPrice,
UnitPriceDiscount: UnitPriceDiscount,
LineTotal: LineTotal,
ModifiedDate: Now()
}
)
);
ForAll combined with Patch took 4 minutes and 2 seconds to write 542 records! Try demoing this to a client on WebEx, with spotty conference room WiFi. Well hopefully after this post, you will never have to experience it yourself.
JSON to the rescue
Patch Command with JSON
Patch(
'[PA].[SalesOrderDetailJson]',
Defaults('[PA].[SalesOrderDetailJson]'),
{
OutputJson: JSON(c_sales_order_detail)
}
);
Using JSON took .652 seconds for a whopping increase of 37,000% in processing time. By converting the collection to JSON format, you can avoid ForAll loop and multiple iterations of Patch with a single write to SQL.
To bring this solution in a full circle, JSON functions in SQL will replicate the table/view structure:
SELECT CAST(JSON_VALUE(js.value, '$.SalesOrderID') AS INT) AS SalesOrderID ,CAST(JSON_VALUE(js.value, '$.SalesOrderDetailID') AS INT) AS SalesOrderDetailID ,CAST(JSON_VALUE(js.value, '$.OrderQty') AS SMALLINT) AS OrderQty ,CAST(JSON_VALUE(js.value, '$.ProductID') AS INT) AS ProductID ,CAST(JSON_VALUE(js.value, '$.UnitPrice') AS MONEY) AS UnitPrice ,CAST(JSON_VALUE(js.value, '$.UnitPriceDiscount') AS MONEY) AS UnitPriceDiscount ,CAST(JSON_VALUE(js.value, '$.LineTotal') AS NUMERIC(38, 6)) AS LineTotal ,CAST(JSON_VALUE(js.value, '$.rowguid') AS uniqueidentifier) AS rowguid ,CAST(JSON_VALUE(js.value, '$.ModifiedDate') AS DATETIME) AS ModifiedDate FROM [PA].[SalesOrderDetailJson] AS sod CROSS APPLY OPENJSON (sod.OutputJson) AS js
I hope this helps you in your journey to integrate Power Apps with SQL. If you have other tips-and-tricks you would like to share, please leave a comment below!

Be First to Comment