Back to blog
PrimentraPrimentra
·July 25, 2026·10 min read

MDS staging errors: where they hide, and what every error code actually means

Home/Blog/MDS staging errors: where they hide, and what every error code actually means
stg.Product_Leaf — after the batch completed
CodeNameCategoryErrorCode
P-1001Widget ATOOLS
P-1002Widget BHand Tools210003
P-1003Widget CTOOLS210001
P-1003Widget CTOOLS210001
ROOTWidget DTOOLS210041
Four rows rejected, three different reasons, and the UI just said the batch completed.

When an MDS staging batch finishes, every processed row in the staging table gets a value in its ErrorCode column, and the readable explanation lives in two views in the Master Data Services database that almost nobody finds:

  • stg.viw_name_MemberErrorDetails — leaf and consolidated member updates
  • stg.viw_name_RelationshipErrorDetails — hierarchy relationship updates

Replace name with your staging table name. The explanation is in the ErrorDescription column.

SELECT * FROM stg.viw_Product_MemberErrorDetails;
SELECT * FROM stg.viw_Product_RelationshipErrorDetails;

Two prerequisites catch people out: you need SELECT permission on the view, and you must be a model administrator. If the view returns nothing and you were expecting rows, check both before you start debugging the data.

Why this is harder than it should be

A staging batch does not fail. It completes, and some of the rows quietly did not become members. The batch status is the same either way, which is why teams discover the problem days later when somebody notices a product missing from a report. (If your batch never reached “completed” in the first place — stuck on Queued to Run, or wedged on Running — that is a different fault entirely, and we walk through those in when a staging batch is not processing.)

There is no notification, no summary, and nothing in the web UI that says “forty-one rows were rejected for three distinct reasons”. If you run staging on a schedule, the practical advice is to query the error views as a step in the job itself and alert on a non-zero count. Almost nobody does this, and it is the single cheapest improvement you can make to an MDS installation.

Every error code, grouped by what went wrong

Microsoft documents these as one flat list sorted roughly by number, which is not how you meet them. Grouped by cause, the same codes make a lot more sense.

Domain-based attributes — the ones you will actually hit

210003The attribute value references a member that does not exist or is inactive. Almost always means you staged the name instead of the code. Domain-based attributes stage by code. Applies to ImportType 0, 1 and 2.
210052You tried to deactivate a member that is in use as a domain-based attribute value elsewhere (ImportType 3 or 4). Clear the references first, or use ImportType 5 or 6 to set them to NULL.

Duplicates and members that do or do not exist

210001The same member code appears multiple times in the staging table. Neither row is created or updated — both are dropped.
300004The member code already exists in the entity, and you used ImportType 1 (create new).
300002The member code is not valid. For relationships, the parent or child code does not exist. For members, ImportType 3 or 4 against a code that is not there.
210006The member code is inactive, with ImportType 1 against a code that does not exist.

Code generation and reserved words

210035MemberCode is required, because no code generation business rule exists.
210036MemberCode is not required, because a code generation rule does exist. You may still supply one.
210041"ROOT" is not a valid member code.
210042"MDMUNUSED" is not a valid member code.

Hierarchies and relationships

210032The hierarchy name is missing or not valid — the explicit hierarchy was not found, or HierarchyName was blank.
210011With RelationshipType 1, the ParentCode cannot be a leaf member. It must be a consolidated member code.
210015The same member code appears multiple times for one hierarchy in one batch — you positioned it twice.
210016The relationship would create a circular reference. You assigned a child as a parent.
210046A member cannot be a sibling of Root. With RelationshipType 2, Root can only be a parent.
210047A member cannot be a sibling of Unused. Members can only be children of the Unused node.
210048ParentCode and ChildCode are the same value. They must differ.

Three mistakes behind most of these

Staging the name instead of the code. Someone exports a spreadsheet where the category column reads Hand Tools, because that is what a human wants to see, and stages it directly. Domain-based attributes resolve by code. Every one of those rows comes back 210003. If you are loading from anything a person touched, translate names to codes before staging, not after.

Using the wrong ImportType for what you are doing. A surprising share of codes are really the same complaint: this operation does not match the state of the data. 300004 is create-when-it-exists. 300002 and 210006 are modify-when-it-does-not. 210052 is deactivate-when-something-still-points-at-it. Before debugging the row, check the ImportType is the one you meant.

Letting duplicates into the batch itself. 210001 and 210015 both mean the staging table disagreed with itself. Worth noting how unforgiving 210001 is: when a code appears twice, neither row is applied. Not the first, not the last. Both are dropped, which is why a batch can quietly leave a member completely absent rather than merely stale.

Make the batch tell you

If you take one thing from this: add a check after the staging step so a partial load cannot pass silently.

-- Fail the job if anything was rejected
DECLARE @Rejected INT;

SELECT  @Rejected = COUNT(*)
FROM    stg.viw_Product_MemberErrorDetails;

IF @Rejected > 0
    THROW 50001, 'MDS staging rejected rows - check the error views.', 1;

Crude, and better than finding out at month-end. Group by ErrorCode in the alert and the cause is usually obvious from the distribution alone — four hundred rows of 210003 is a name-versus-code problem, not four hundred separate mistakes.

One thing worth saying

The Microsoft documentation pages for these error codes now carry a banner explaining that MDS is removed in SQL Server 2025. The reference is still accurate and still useful — SQL Server 2022 is supported into 2033, so plenty of people will be reading staging errors for years yet. But nobody is going to improve this tooling now, and the error views are exactly as discoverable as they were in 2010.

If you are debugging staging often enough to have found this page, that is worth weighing. Not as a reason to panic — nothing breaks in 2028 whatever you have read elsewhere — but the effort you spend building alerting around a staging process is effort spent on a product with no roadmap. Our end-of-life checklist covers the timing honestly, and getting your data out covers the mechanics.

What this looks like when it is not silent

Primentra stages data too, and the difference is mostly in what happens to a bad row. Validation runs per field with the reason attached to the row, rejected records surface in the UI rather than in a view you have to know the name of, and domain values resolve by lookup so the name-versus-code trap does not arise in the first place. We wrote up the mechanics in import actions and merge modes and the automation in inside the staging scheduler.

Frequently asked questions

How do I see why MDS staging failed?

Query the two error views in the MDS database: stg.viw_name_MemberErrorDetails for leaf and consolidated members, and stg.viw_name_RelationshipErrorDetails for hierarchy relationships, replacing name with your staging table name. The readable explanation is in ErrorDescription. You need SELECT permission on the view and model administrator rights.

What is the ErrorCode column in the MDS staging table?

When a batch completes, every processed row carries a value in ErrorCode identifying why it was rejected. The codes group into duplicates and existence problems, domain-based attribute failures, code-generation mismatches, reserved words, and hierarchy violations. The error views express the same information as text.

What does MDS error 210003 mean?

An attribute value references a member that does not exist or is inactive — almost always because you staged a display name where a code was required. Domain-based attributes stage by code, not name. It applies to ImportType 0, 1 and 2, and it is the most common staging error for data that came from a spreadsheet.

Why can I not deactivate a member in MDS staging?

Error 210052: the member code is in use as a domain-based attribute value on other members, so deactivating it with ImportType 3 or 4 would orphan them. Clear the references first, or use ImportType 5 or 6 to set those values to NULL, then deactivate.

Staging that says what it rejected

Primentra runs on your SQL Server and shows rejected rows with the reason attached, in the interface, rather than in a view you have to know the name of. Load a real file into the 60-day trial and see what a bad row looks like when it is not silent.

Start free 60-day trial →Getting your data out of MDS →Staging load strategies →

More from the blog

Your MDS staging batch is not processing. Work down this list.10 min readHow to get your data out of MDS before you lose access to it10 min readIs there Master Data Services in Microsoft Fabric? No — and here is what people do instead9 min read

Ready to migrate from Microsoft MDS?

Join the waitlist and be the first to try Primentra. All features included.

Download Free TrialTry DemoCompare MDM tools
MDS staging errors: where they hide, and what every error code actually means | Primentra