[英]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中,查询执行看起来像这样:
由于查询执行的步骤,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.