繁体   English   中英

加入不存在的表

[英]Join on table that does not exist

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

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

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

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

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

你可以这样做:

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

Select *
from tbl

End
Else
Begin
--Do something else
End

基本上检查表是否存在并运行查询,如果不存在则执行其他操作。

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

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

由于查询执行的步骤,RDBMS总是检查引用的对象(在名称解析步骤期间),之后执行实际的查询处理(执行任何用户定义的检查 - 例如IF语句)。 (这代表数据操作,而不是数据定义)。

简而言之:在大多数RDBMS中,您不能这样做,但只能使用动态查询。

在我看来,动态查询有时是有用的,但不是一个简单的任务维护和调试它们,所以要小心,特别是如果查询生成基于复杂的逻辑。

请记住,大多数客户端应用程序只接受预定义的结果集(包括列及其类型),因此使用动态查询也可能是客户端应用程序中的问题。

对于Sybase,您可以在其在线文档中阅读有关查询处理的更多信息: 性能和调优系列:查询处理和抽象计划

SQL Server

尝试使用TRY / CATCH,它可以包含任何高达错误严重性20的内容。

在您的情况下,您尝试捕获错误严重性11 - “表示给定的对象或实体不存在。” - 在TRY / CATCH块中应该没问题。

更多信息和示例: https//msdn.microsoft.com/en-us/library/ms175976.aspx

在我的情况下,我只使用它来删除表 - 不再费心去做一个IF语句,检查表是否存在。

开始尝试DROP TABLE XXX结束尝试开始捕捉结束捕捉

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM