当我只知道名字的一部分时检查是否存在临时 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___________;
我有一个功能可以检查某些 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___________;