As of the November update of Power Query, it’s now possible to write your own SQL query when you’re moving data out of SQL Server into Excel using Power Query. So I got thinking… if you can write your own SQL query, can you execute any other SQL statement? Can you use Power Query to move data out of Excel and into SQL Server? Well, it turns out you can… with some limitations. This blog post details what I found out while researching this problem.
I started with a simple table in a SQL Server database with two columns, Fruit and Sales, and some data:
I then created a new function in Power Query with the following definition:
let
UpdateFunction = (Fruit, Sales) =>
Sql.Database(
"MySQLServerInstance",
"PowerQueryTest",
[Query="UPDATE [FruitSales] SET [Sales]=" & Number.ToText(Sales)
& " WHERE Fruit='" & Fruit & "'"])
in
UpdateFunction
As you can see, it takes the name of a fruit and a sales value and updates the appropriate row in the SQL Server table. I then created a new table in Excel with some new fruit sales values:
Used this table as the source for another Power Query query, and for each row in this table called the function above:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
InsertedCustom = Table.AddColumn(Source, "Custom", each UpdateFunction([Fruit],[Sales])),
#"Expand Custom" = Table.ExpandTableColumn(InsertedCustom, "Custom"
, {"Records Affected"}, {"Custom.Records Affected"})
in
#"Expand Custom"
I ran this query, and lo! My table in SQL Server was updated:
There are some interesting things to note here though. First, for each row in my Excel table, and each time an UPDATE statement was run, Power Query showed a prompt warning me that it was about to make a change to my database:
Probably the safe thing to do here, I think.
Furthermore, running a Profiler trace showed that each UPDATE statement was run at least twice. In fact, I originally started my tests with an INSERT INTO rather than an UPDATE, and found that since the INSERT INTO was run multiple times I ended up with duplicate rows in my table.
None of the code I’ve showed here should be used in a real application of course, but with some thought (and maybe a few changes to the way Power Query behaves), in the future it might be possible to use Power Query to move data out of Excel as well as in.