I have several comments here:- First, is there any documentation of this "eval" function? I can't find anything by searching on the sqlite web site. I wrote a user-defined function which can be used in a script to evaluate a possibly dynamically constructed SQL statement, and return any error message as a text string, which solves the OP's problem for me: I don't know if "eval" would have helped me with that. Second, if tables and views share a namespace, the documentation doesn't appear to mention this. Third, if tables and views share a namesapce, IMHO it ought to be possible to delete an object in that namespace without needing to know whether it is a table or a view. The current implementation does not allow this. Fourth, I described what I believe is a perfectly reasonable use case in another post at https://sqlite.org/forum/forumpost/53a2dec184. I maintain a program which has a UI which allows a user to do various useful things on more or less any sqlite database: it examines the schema to find out which objects exist. I have a bunch of test scripts (the program can load and run a script of SQL statements), which of course I run on a test database. A failed test can leave a view or a table still existing. I don't want to have to clean up by hand after errors, so I want my test scripts to DROP any views or tables that they will create. So I want to start off with DROP VIEW IF EXISTS xxx ; DROP TABLE IF EXISTS xxx ; for each table or view xxx that the script is subsequently going to create. I fell over the same issue as the OP in this post. The solution that works for me is SELECT exec(NULL, 'DROP VIEW IF EXISTS xxx') ; SELECT exec(NULL, 'DROP TABLE IF EXISTS xxx') ; where "exec" is the user-defined function that I mentioned above. If the first argument is NULL, it just ignores any error. Incidentally the program I mentioned above is a valid example of a database using program which does *not* know what objects exist in the database, except of course by examining the schema.