Preserving Data Types With SQL Queries In Power Query And Power BI

My post earlier this year on enabling query folding when using SQL queries as a data source in Power Query provoked a lot of interest. This post adds one more useful detail: how to preserve the original data types of the columns in your query when using this technique with SQL Server-related sources.

Consider the DimDate table in the AdventureWorksDW2017 sample database for SQL Server:

Notice that the FullDateAlternateKey column has the data type Date.

If you connect to this table in the normal way, by selecting it in the Navigation pane when you connect to your SQL Server instance, the M code for your Power Query query will look something like this:

let
  Source = Sql.Databases("localhost"), 
  AdventureWorksDW2017 = Source
    {[Name = "AdventureWorksDW2017"]}
    [Data], 
  dbo_DimDate = AdventureWorksDW2017
    {[Schema = "dbo", Item = "DimDate"]}
    [Data]
in
  dbo_DimDate

Unsurprisingly, the FullDateAlternateKey column in the Power Query query also has a data type of Date, as indicated by the calendar icon on the left side of the column header in the Power Query Editor:

However, if you use Value.NativeQuery to run a SQL query to get the same data and set EnableFolding=true, like so:

let
  Source = Sql.Databases("localhost"), 
  AdventureWorksDW2017 = Source
    {[Name = "AdventureWorksDW2017"]}
    [Data], 
  Q = Value.NativeQuery(
    AdventureWorksDW2017, 
    "Select * From DimDate", 
    null, 
    [EnableFolding = true]
  )
in
  Q

…you’ll see that the FullDateAlternateKey column comes through as a DateTime type instead:

The same thing would happen with a column of type Time too, ie it would come through as a DateTime.

If you want the types in the output of Value.NativeQuery to match the types in the output of the first Power Query query above there’s an extra option you need to add: PreserveTypes=true.

let
  Source = Sql.Databases("localhost"), 
  AdventureWorksDW2017 = Source
    {[Name = "AdventureWorksDW2017"]}
    [Data], 
  Q = Value.NativeQuery(
    AdventureWorksDW2017, 
    "Select * From DimDate", 
    null, 
    [
      PreserveTypes = true, 
      EnableFolding = true
    ]
  )
in
  Q

In the output of this query, FullDateAlternateKey has the data type Date again:

This option is only available for the SQL Server connector (and connectors related to it) at the time of writing.

[Thanks to Curt Hagenlocher for this information]

4 responses

  1. Thanks for informing Chris. As I understand, these optional options in the Value.NativeQuery command belongs to the connector. I looked at the SQL connector documentation page but didn’t found any information about neither EnablingFolding or PreserveTypes.
    Do you think this has been left out by intention (I.e. not supported) or just by mistake. Or am I just not looking at the right place or documentation.

  2. Hi Chris – love your blog and follow religiously.
    I’m wondering if you can shed some light on something that I’m seeing that is somewhat related – and have asking Microsoft but haven’t received a reply.
    If I import a SQL Server table with Whole Numbers and then import a flat file with the same columns (Whole Numbers) and then do an append Power Query seems to magically change the whole numbers to decimals. Not sure if it’s a GUI thing or an underlying datatype thing but curious if you’ve seen this as well.
    Thanks!
    Eric

  3. Pingback: Preserving SQL Data Types when Query Folding – Curated SQL

Leave a Reply to Eric Lofstrom Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: