Error 208

Troubleshooting SQL Server

Troubleshooting

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

CREATE TABLE

Creating and Modifying a Table

Errors 1 - 999

EXECUTE

Information Schema Views

Querying SQL Server System Catalogs

SELECT

sp_help

sysobjects

Transact-SQL Syntax Conventions

USE