加入不存在的表

时间:2015-02-03 11:42:43

标签: sql database join sybase sybase-ase

当一个或多个表甚至不存在时,是否可以连接表?

考虑这个用例:您正在使用一些具有开箱即用的某种DB方案的系统,但也允许您创建自己的自定义表。

可以运行某种包含自定义表格的查询,但对于没有设置这些自定义表格的人也可以正常运行吗?

或者,无需维护不同版本的查询,最优雅的方法是什么?

编辑:特别是对于Sybase ASE,但我也对其他dbms感兴趣。

3 个答案:

答案 0 :(得分:2)

你可以这样做:

IF EXISTS (Select * from sysobjects where name = 'tblname')
Begin

Select *
from tbl

End
Else
Begin
--Do something else
End

基本上检查表是否存在并运行查询(如果有),如果它没有那么做。

答案 1 :(得分:1)

在大多数RDBMS中,查询执行看起来像这样:

  • 分析器
    • 名称解析(检查引用的对象,绑定别名等)
    • 类型派生(确定结果集中的最终类型)
    • Aggregate bindinf(确定是否需要任何聚合)
    • 组绑定(将聚合绑定到选择列表)
  • Algebrizer
  • 优化
  • 执行

由于查询执行的步骤,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