是否有任何方法可以确定是否在会话中创建了特定的临时表而不引用创建它的 tempdb 数据库?用户在登录时被分配到特定的 tempdb,所以我不知道他们将使用哪个 tempdb。
我不需要指定一个 tempdb 来从临时表中选择数据,所以我肯定可以看到该表是否存在?
是否有任何方法可以确定是否在会话中创建了特定的临时表而不引用创建它的 tempdb 数据库?用户在登录时被分配到特定的 tempdb,所以我不知道他们将使用哪个 tempdb。
我不需要指定一个 tempdb 来从临时表中选择数据,所以我肯定可以看到该表是否存在?
您可以使用 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)
)
在我看来,您不应该在这里使用临时表......这些看起来更像是常规表(可能带有用户标识符)。这里的场景是什么?
请注意,以这种方式使用临时表可能会对优化器/查询缓存造成严重破坏——它必须进行大量的重新编译,因为 #FOO 的含义在每次调用时都会发生很大变化。