当我只知道名字的一部分时检查是否存在临时 table?

Check if a temp table exists when I only know part of the name?

我有一个功能可以检查某些 table 是否存在于我的数据库中,使用 table 名称的一部分作为匹配的键(我的 table 命名约定包括唯一table 名称前缀)。它使用如下 select 语句,其中 @TablePrefix 是函数的参数,包含 table 名称的前几个字符:

DECLARE @R bit;

    SELECT @R = COUNT(X.X)
        FROM ( 
          SELECT TOP(1) 1 X FROM sys.tables WHERE [name] LIKE @TablePrefix + '%' 
        ) AS X;
    
RETURN @R;

我的问题是,如何扩展此功能以使其也适用于#temp tables?

我已经尝试检查名称的第一个字符 # 然后使用相同的逻辑从 tempdb.sys.tables 到 select 但这似乎有一个致命的缺陷 - 它 returns当任何具有匹配名称的 temp table 存在时,即使不是由当前会话创建的 - 即使由不同数据库中的 SP 创建也是如此。似乎没有任何直接的方法可以将 selection 缩小到仅存在于当前会话上下文中的那些临时 tables。

我不能使用其他似乎普遍建议的方法来检查温度 tables - IF OBJECT('tempdb..#temp1') IS NOT NULL - 因为这需要我知道 table 的全名,不仅仅是前缀。

尝试这样的事情:

DECLARE @TablePrefix VARCHAR(50) = '#temp';

    DECLARE @R BIT, @pre VARCHAR(50) = @TablePrefix + '%';

    SELECT @R = CASE LEFT ( @pre, 1 )
        WHEN '#' THEN ( 
            SELECT CASE WHEN EXISTS ( SELECT * FROM tempdb.sys.tables WHERE [name] LIKE @pre ) THEN 1
            ELSE 0
        END )
        ELSE ( 
            SELECT CASE WHEN EXISTS ( SELECT * FROM sys.tables WHERE [name] LIKE @pre ) THEN 1
            ELSE 0
        END )
    END;
    
    SELECT @R AS TableExists;
create table #abc(id bit);
create table #abc_(id bit);
create table #def__(id bit);
create table #xyz___________(id bit);
go

select distinct (left(t.name, n.r)) as tblname
from tempdb.sys.tables as t with(nolock)
cross join  (select top(116) row_number() over(order by(select null)) as r from sys.all_objects with(nolock)) as n
where t.name like '#%'
and object_id('tempdb..'+left(t.name, n.r)) is not null;


drop table #abc;
drop table #abc_;
drop table #def__;
drop table #xyz___________;