Our service desk lead wanted a Teams message whenever a request changed status. The first test run posted “Status: 770700001” to the channel, and nobody on the team knew what that meant.
If you come from SharePoint, you’d reach for ?['Value'] on the choice field. Dataverse doesn’t work that way. It stores the option’s integer and sends the readable label in a separate key that the dynamic content pane doesn’t always make obvious.
In this tutorial, we’ll get choice column value from Dataverse in both forms, the label and the number. We’ll read single and multi-select choices, pull labels for every row, filter by a choice, set one in Add a new row, and fix the errors I hit along the way.
Quick answer: Every Get a row by ID and List rows output carries the number in cr85a_status and the label in cr85a_status@OData.Community.Display.V1.FormattedValue. Use outputs('Get_a_row_by_ID')?['body/cr85a_status@OData.Community.Display.V1.FormattedValue'] for the label (“In Progress”). Filter and set choices with the number, such as 770700001.
Why Does Dataverse Return a Number Instead of the Label?
A choice column (the old option set) keeps two things for each option: a Label people see and a Value number the database stores. If Dataverse itself is new to you, start with what Microsoft Dataverse is and how its tables work.
Our Service Request table has a Status choice with Open (770700000), In Progress (770700001) and Closed (770700002). The cr85a_ prefix is our publisher prefix; yours will be different.
The Dataverse connector asks for every annotation, so the raw output of a row shows both keys side by side:
"cr85a_status@OData.Community.Display.V1.FormattedValue": "In Progress",
"cr85a_status": 770700001

Get the Choice Label From One Row
Here’s how I built the test flow. The Get a row by ID action in Power Automate post covers finding the row’s GUID.
- Go to make.powerautomate.com, pick the environment that holds your table, and select Create > Instant cloud flow > Manually trigger a flow.
- Add the Microsoft Dataverse action Get a row by ID, choose your table (Service Requests) and paste a row GUID.
- Add a Compose action and type the expressions below in the expression editor.
- Save, select Test > Manually > Run flow, then open the run and check the Compose output.
{
"StatusValue": "@{outputs('Get_a_row_by_ID')?['body/cr85a_status']}",
"StatusLabel": "@{outputs('Get_a_row_by_ID')?['body/cr85a_status@OData.Community.Display.V1.FormattedValue']}",
"PriorityLabel": "@{outputs('Get_a_row_by_ID')?['body/cr85a_priority@OData.Community.Display.V1.FormattedValue']}"
}

For the Network Issue row, the Compose returned 770700001 and “In Progress”, and the Priority label was “High”. The key name is case-sensitive, so copy it from the raw output rather than typing it.

What About the When a Row Is Added Trigger?
Using the When a row is added, modified or deleted trigger instead? Its output can name the label key differently, so open the trigger’s raw outputs once and copy whichever key holds the label.
Multi-Select Choices and Lookup Labels
A multi-select choice (Microsoft calls it choices) comes back as one comma-separated string of numbers. Our Affected Systems column returned "770700000,770700001", and its FormattedValue was "Email; VPN", with a semicolon and a space between labels.
To loop through the selected options, split the numbers into an array. Our guide on splitting a string into an array in Power Automate explains the function. SharePoint handles this differently, as our SharePoint multi-select choice values post shows.
split(outputs('Get_a_row_by_ID')?['body/cr85a_affectedsystems'], ',')
Lookups follow the same pattern. _cr85a_customer_value holds the related row’s GUID, and _cr85a_customer_value@OData.Community.Display.V1.FormattedValue returned the customer’s name, “Bob”.
Get Labels for Every Row With Select
With List rows you get an array, so wrap the same keys in item(). I used a Select action instead of Apply to each because it maps every row in one step. Our post on counting rows from a Dataverse table sets up the List rows action.
From: @{outputs('List_rows')?['body/value']}
Map:
Request -> @{item()?['cr85a_subject']}
StatusValue -> @{item()?['cr85a_status']}
Status -> @{item()?['cr85a_status@OData.Community.Display.V1.FormattedValue']}
Priority -> @{item()?['cr85a_priority@OData.Community.Display.V1.FormattedValue']}
The labels came through even though Select columns listed only five columns. The first item read Login Issue, 770700002, Closed, High.

Building a canvas app on the same table instead? The Power Apps side works differently, and our Power Apps Dataverse choices guide covers it.
Filter List Rows by a Choice Value
Filter rows on a choice must use the number. To list only the Open requests, I set Filter rows to this OData query:
cr85a_status eq 770700000

A Compose with length() on the result returned 3, which matched the three Open rows in the table.

Set a Choice in Add a New Row or Update a Row
The designer helps here. In Add a new row, the Status and Priority boxes are dropdowns that show labels like Open and Medium, but the flow saves 770700000 and 770700001. Our posts on adding a new row to Dataverse and updating a Dataverse row walk through both actions.

When the value comes from an expression or another system, pass the integer. Update a row then shows it as a custom value, 770700001, in the Status box.
How Do You Find a Choice’s Integer Values?
- In Power Apps: go to make.powerapps.com, open Tables, select your table, open Columns and select the choice column. Each option lists its Label and Value.
- In a flow run: run List rows without a filter and compare each number with its FormattedValue in the raw outputs.
- From the error: a wrong number in Add a new row fails with a message that lists every accepted value (see below).
Don’t change the generated values. Microsoft recommends keeping them, because unique values stop clashes with options from imported solutions.
Choice Formula Columns in Dataverse
A Dataverse formula column can also return a choice. Microsoft Learn says it shows up as Choice fx and must use a global choice or the local choice of a simple choice column. Our Dataverse formula column guide shows how to build one.
Two limits matter in flows. Inside the formula, use Value() to get an option’s number, because options can’t go into text functions. And you can’t write to a formula column: saving our flow failed with “The API operation does not contain a definition for parameter ‘item/cr85a_requestcategory’.”
Common Errors and How to Fix Them
Edm.Int32 and Edm.String for Operator Kind ‘Equal’
Filtering by the label, cr85a_status eq 'Open', failed with BadRequest: “A binary operator with incompatible types was detected. Found operand types ‘Edm.Int32’ and ‘Edm.String’ for operator kind ‘Equal’.” Fix: filter on 770700000.

The Value 999 Is Outside the Valid Range
Setting Status to 999 in Add a new row returned BadRequest (0x8004431a): “The value 999 of ‘cr85a_status’ … is outside the valid range. Accepted Values: 770700000,770700001,770700002”. Fix: use one of the listed numbers.
The Label Comes Back Empty
Check the key against the raw output: the logical name, not the display name, plus the exact @OData.Community.Display.V1.FormattedValue suffix. An empty column has no label either, so add a fallback with the Power Automate if expression.
For more Dataverse and flow tutorials, browse our Power Automate tutorials.
If you’re building more Dataverse flows, these are worth a look next:
Frequently Asked Questions
How do I get a choice field value in Power Automate from Dataverse?
Read the column plus the suffix @OData.Community.Display.V1.FormattedValue for the label, or the plain column for the number. Microsoft explains formatted values in Select columns using OData.
How do I convert a Dataverse choice to text in a flow?
You don’t need to convert it. The FormattedValue key already holds the label as text, such as In Progress.
Can I filter Dataverse List rows by a choice label?
No. Filter rows on a choice column needs the integer, such as cr85a_status eq 770700000. A label filter fails with an Edm.Int32 and Edm.String error.
How do I get the labels of a multi-select choice column?
Use the same FormattedValue key. It returns every selected label in one string separated by semicolons, such as Email; VPN.
Can a Dataverse formula column return a choice?
Yes. A formula column can return a choice from a global choice or a simple local choice column, but flows can’t write to it.

Hey! I’m Bijay Kumar, founder of SPGuides.com and a Microsoft Business Applications MVP (Power Automate, Power Apps). I launched this site in 2020 because I truly enjoy working with SharePoint, Power Platform, and SharePoint Framework (SPFx), and wanted to share that passion through step-by-step tutorials, guides, and training videos. My mission is to help you learn these technologies so you can utilize SharePoint, enhance productivity, and potentially build business solutions along the way.