Sql 对不存在的表进行联接

Sql 对不存在的表进行联接,sql,database,join,sybase,sap-ase,Sql,Database,Join,Sybase,Sap Ase,当一个或多个表甚至不存在时,是否可以联接表 考虑这个用例:您使用的系统具有某种现成的DB方案,但也允许您创建自己的自定义表 可以运行包含自定义表的某种查询,但对于未设置这些自定义表的用户也可以运行而不出错 或者,在不必维护不同版本的查询的情况下,实现这一点最优雅的方法是什么 编辑:特别是对于Sybase ASE,但我也对其他dbms感兴趣。您可以这样做: IF EXISTS (Select * from sysobjects where name = 'tblname') Begin Sele

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

考虑这个用例:您使用的系统具有某种现成的DB方案,但也允许您创建自己的自定义表

可以运行包含自定义表的某种查询,但对于未设置这些自定义表的用户也可以运行而不出错

或者,在不必维护不同版本的查询的情况下,实现这一点最优雅的方法是什么


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

您可以这样做:

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

Select *
from tbl

End
Else
Begin
--Do something else
End
基本上检查表是否存在,如果存在,则运行查询;如果不存在,则执行其他操作。

SQL Server

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

在您的情况下,您试图捕获错误严重性11-“表示给定的对象或实体不存在。”-这在TRY/catch块中应该可以

更多信息和示例如下:

在我的例子中,我专门用它来删除表——再也懒得用IF语句来检查表是否存在了


BEGIN TRY DROP TABLE XXX END TRY BEGIN CATCH END CATCH在大多数RDBMS中,查询执行如下所示:

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

Select *
from tbl

End
Else
Begin
--Do something else
End
  • 分析器
    • 名称解析(检查引用对象、绑定别名等)
    • 类型派生(确定结果集中的最终类型)
    • 聚合bindinf(确定是否需要任何聚合)
    • 组绑定(将聚合绑定到选择列表)
  • 阿尔及利亚人
  • 优化器
  • 执行
由于查询执行的步骤,RDBMS总是检查引用的对象(在名称解析步骤期间),实际的查询处理(执行任何用户定义的检查,例如IF语句)在此之后执行。(这表示数据操作,而不是数据定义)

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

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

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


对于Sybase,您可以在其在线文档中阅读有关查询处理的更多信息:

您想使用的任何特定dbms?(使用信息_schema.tables查看该表是否存在,如果该表存在或不存在,则有单独的查询。)我的dbms将是Sybase ASE这实际上会在大多数系统上引发一个
无效对象名
错误或类似错误。您能在您的计算机上运行吗?我想没有。。它永远不会命中
或者
,如果tbl不存在,它只会抛出一个错误:)哦,是的,这是一个很好的观点。虽然我确信如果OP使用的是不同的DBMSThanks,也会有其他的选择,但是上面的内容应该只适用于SQL Server,你能提供一个简单的例子吗?