The multi-part identifier "Owners.Id" could not be bound. (error 4104) means a column is prefixed with a name the query does not know. Almost always the table was given an alias and the query still uses the table name, or the prefix points at a table that is not in the FROM clause at all. Use the alias everywhere, and join every table you reference.

The quoted name in the message is the exact prefix that failed, so search the query for it. Once a table has an alias, the alias is the only name for it inside that query.

The error

SELECT o.FullName, v.VisitDate
FROM dbo.Owners AS o
JOIN dbo.Visits AS v ON Owners.Id = v.OwnerId;

Msg 4104, Level 16, State 1, Server MACHINE\LOCALDB#EAD42A01, Line 4
The multi-part identifier "Owners.Id" could not be bound.

Why it happens

A multi-part identifier is a column written with a prefix, such as o.FullName or dbo.Owners.Id. SQL Server binds each prefix to a table source in the FROM clause. Writing dbo.Owners AS o replaces the table's name with o for the rest of the query, so Owners.Id no longer matches anything and binding fails before the query runs. Nothing is read and nothing is changed.

The second cause is a prefix whose table was never joined. Here the select list uses o.FullName, but only dbo.Visits is in FROM:

SELECT v.Id, v.VisitDate, o.FullName
FROM dbo.Visits AS v;

Msg 4104, Level 16, State 1, Server MACHINE\LOCALDB#EAD42A01, Line 2
The multi-part identifier "o.FullName" could not be bound.

The same message appears when a query is edited in pieces: a join is removed but its columns stay in the select list or the WHERE clause, or a column is copied from another query whose alias was different. Typos in an alias give it too.

The fix

SELECT o.FullName, v.VisitDate
FROM dbo.Owners AS o
JOIN dbo.Visits AS v ON o.Id = v.OwnerId
ORDER BY v.VisitDate;

With the alias used in the ON clause and both tables in FROM, the query returned three rows: Maria Garcia on 2026-11-02, David Chen on 2026-11-03 and Maria Garcia again on 2026-11-05. The rule to remember is one name per table source: either alias a table and use the alias everywhere, or do not alias it and use the table name everywhere. Short, consistent aliases such as the first letter of each table make the mistake easy to spot when the message quotes the prefix back to you.

How it was reproduced

One script run with sqlcmd -S "(localdb)\MSSQLLocalDB" -d fix8_lab -I -i e4104.sql on SQL Server 2022 LocalDB 16.0.1210.3 and sqlcmd 16.0.1000.6, in a throwaway database fix8_lab created for the test and dropped afterwards. Two tables, owners and visits, with a foreign key between them and three fictional rows. Both failing queries and the fixed one ran in the same script; the line number in each message counts from the start of its batch.

Frequently asked

What does 'The multi-part identifier could not be bound' mean?
SQL Server error 4104 means a column prefix, such as Owners.Id or o.FullName, does not match any table or alias in the FROM clause of that query, so the column cannot be resolved.
Why does using the table name fail after I alias the table?
An alias replaces the table name for the whole query. After FROM dbo.Owners AS o, only o refers to that table, so Owners.Id fails with error 4104. Use o.Id instead.
Can error 4104 come from a missing JOIN?
Yes. If the select list or WHERE clause uses a prefix for a table that is not in FROM or any JOIN, SQL Server reports that prefix as not bound. Add the join or remove the column.

More decoded errors in the Fixes category.