【问题标题】:Testing for the existence of a temporary table in a multi tempdb environment?在多 tempdb 环境中测试临时表是否存在?
【发布时间】:2010-09-16 10:11:59
【问题描述】:

是否有任何方法可以确定是否在会话中创建了特定的临时表,而无需引用创建它的 tempdb 数据库?用户在登录时被分配到特定的 tempdb,所以我不知道他们将使用哪个 tempdb。

我不需要指定一个tempdb来从临时表中选择数据,所以我肯定可以看到该表是否存在?

【问题讨论】:

    标签: tsql sybase temp-tables


    【解决方案1】:

    您可以使用 object_id 检查是否存在临时对象:

    SELECT object_id('#tmpTable')
    

    您可以根据需要指定要使用的 tempdb,但您不必这样做:

    SELECT object_id('tempdb..#tmpTable')
    

    值得注意的是,这也适用于全局临时表:

    SELECT object_id('##tmpTable')
    

    为了使脚本可以重新运行而不必在最后执行 DROP TABLE,我总是在创建临时表之前进行检查和删除。我经常在开发 SQL 代码时留下创建的表。

    IF NULLIF(object_id('#tmpTable'), 0) IS NOT NULL DROP TABLE #tmpTable
    CREATE TABLE #tmpTable (
        id int,
        col1 varchar(100)
    )
    

    【讨论】:

      【解决方案2】:

      在我看来,您不应该在这里使用临时表......这些看起来更像是常规表(可能带有用户标识符)。这里的场景是什么?

      请注意,以这种方式使用临时表可能会对优化器/查询缓存造成严重破坏 - 它必须进行大量重新编译,因为每次调用 #FOO 的含义都会发生很大变化。

      【讨论】:

      • 这是一个复杂的场景来解释,这是所有遗留应用程序和疯狂的要求(包括不使用常规表)。基本上,我需要一个应用程序来创建临时表(通过立即执行),然后使用存储过程来填充它。然后让应用程序从表中读取。 WTF。
      • 在这种情况下,我可以建议的最好的事情是尝试从表中选择,看看它是否会出错!对不起...
      • 谢谢,这就是我目前正在做的,但感觉有点不雅。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2012-06-28
      • 2011-09-25
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多