Error 208
Severity Level 16
Message Text
Invalid object name '%.*ls'.
Explanation
This error occurs when an object that does not exist is referenced. If the object exists, you might need to include the owner's name in the object name.
If the object is not owned by the user attempting to access it, and it is not owned by the database owner, all references to the object must include the owner's name. For example, if user1 creates a table called test, other users must use the name user1.test when they refer to the table.
The Microsoft® SQL Server™ naming convention for database objects is:
[[[server_name.][database_name].][owner_name].]object_name
The default value for server_name is the current server and the default value for database_name is the current database. The default value for owner_name is the current user. Because owner_name is part of the object name, it is possible for two different users to have tables with the same name in the same database (for example, user1.test and user2.test). For more information about naming conventions, see Transact-SQL Syntax Conventions.
This message can also occur when you reference a temporary table that was created with an EXECUTE statement.
Action
The procedure for handling this error depends on what you know about the object indicated in the error message text.
The appropriate permissions must also be set to allow access to an object. If these permissions are not set, error 229 or 230 occurs.
If you do not know who owns the object
- Execute sp_help with no parameters to display the object owner.
Or
- Query the Information Schema Views if the object is a table or view to determine the object owner and type. If the object is not a table or a view, query the sysobjects system table to determine the object owner and type.
For example, to determine the owner and type for the object named table_1, execute the following:
USE master
GO
SELECT TABLE_SCHEMA
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'table_1'
GO
If no rows are returned from this query, the object either resides in a different database or does not exist.
If you do not own the object in question
- Include the object owner in the object name. For example:
SELECT * FROM user1.table_1
Although using fully qualified object names eliminates this problem, remember that including the fully qualified object name in an application might complicate the maintenance of the application. For example, if all references to a table include the database name, changing the database name could become difficult.
Or
- Have the database owner create the object. If the owner creates the object, any user can find the object without specifying the owner. However, temporary tables reside in tempdb and are dropped automatically when the user process or server connection that created them is terminated. Users cannot share temporary tables, even if they are created by the database owner.
If the object does not reside in the database
- Switch context to the correct database using the USE statement. For example:
USE database_1
Or
- Qualify the object name with the database name. For example:
SELECT * FROM database_1.user1.table_1
If you own the object or if the object is owned by the database owner, the owner name is not needed. For example:
SELECT * FROM database_1..table_1
If a temporary table created with an EXECUTE statement is referenced
- If you must use the EXECUTE statement to create a temporary table, create it as a global temporary table using the syntax ##tablename.
See Also
Creating and Modifying a Table
Querying SQL Server System Catalogs