当一个或多个表甚至不存在时,是否可以连接表?
考虑这个用例:您正在使用一些具有开箱即用的某种DB方案的系统,但也允许您创建自己的自定义表。
可以运行某种包含自定义表格的查询,但对于没有设置这些自定义表格的人也可以正常运行吗?
或者,无需维护不同版本的查询,最优雅的方法是什么?
编辑:特别是对于Sybase ASE,但我也对其他dbms感兴趣。
答案 0 :(得分:2)
你可以这样做:
IF EXISTS (Select * from sysobjects where name = 'tblname')
Begin
Select *
from tbl
End
Else
Begin
--Do something else
End
基本上检查表是否存在并运行查询(如果有),如果它没有那么做。
答案 1 :(得分:1)
在大多数RDBMS中,查询执行看起来像这样:
由于查询执行的步骤,RDBMS总是检查引用的对象(在名称解析步骤期间),之后执行实际的查询处理(执行任何用户定义的检查 - 例如IF语句)。 (这代表数据操作,而不是数据定义)。
简而言之:在大多数RDBMS中,您无法执行此操作,但只能使用动态查询。
在我看来,动态查询有时很有用,但维护和调试它们并不容易,所以要小心,特别是如果查询生成基于复杂的逻辑。
请记住,大多数客户端应用程序只接受预定义的结果集(包括列及其类型),因此使用动态查询也可能是客户端应用程序中的问题。
对于Sybase,您可以在其中找到有关查询处理的更多信息:Performance and Tuning Series: Query Processing and Abstract Plans
答案 2 :(得分:0)
SQL Server
尝试使用TRY / CATCH,它可以包含任何高达错误严重程度为20的内容。
在您的情况下,您尝试捕获错误严重性11 - “表示给定的对象或实体不存在。” - 在TRY / CATCH块中应该没问题。
此处有更多信息和示例:https://msdn.microsoft.com/en-us/library/ms175976.aspx
在我的情况下,我只使用它来删除表 - 不再需要做IF语句,以检查表是否存在。
BEGIN TRY DROP TABLE XXX END TRY BEGIN CATCH END CATCH