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.