当我只知道部分名称时,检查临时表是否存在



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

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表?

我曾尝试检查名称的第一个字符中的#,然后使用相同的逻辑从tempdb.sys.tables中进行选择,但这似乎有一个致命的缺陷-当存在具有匹配名称的任何临时表时,即使不是由当前会话创建的,也会返回正结果-即使是由不同数据库中的SP创建的。似乎没有任何直接的方法可以将选择范围缩小到仅存在于当前会话上下文中的临时表。

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

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___________;

试试这样的东西:

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;

最新更新