Sql 用于选择表名的正则表达式

Sql 用于选择表名的正则表达式,sql,sql-server,Sql,Sql Server,SQL Server 2012 以下查询获取容器数据库中存在的所有架构和对应表: select table_schema,TABLE_NAME from information_schema.tables where TABLE_SCHEMA not in ('cdc') and table_type in ('base table','view') cdc架构如下所示: 事实: cdc模式有两个更改表CTdata_PERSONESSION_ct、datalake_PERSO

SQL Server 2012

以下查询获取容器数据库中存在的所有架构和对应表:

select  table_schema,TABLE_NAME from information_schema.tables where        
TABLE_SCHEMA not in ('cdc') and table_type in ('base table','view')
cdc架构如下所示:

事实:

cdc模式有两个更改表CTdata_PERSONESSION_ct、datalake_PERSONESSION_ct,用于dbo模式中的一个tabledbo.datalake_PERSONESSION 将来,对于任何模式中的表,可以有两个或多个CT 我正在尝试编写一个查询,根据在其他模式中找到的所有表,提供cdc模式下所有CT表的列表,但我不知道如何在select子句中包含regexif,如SchemaName\u TableName\u NEW\u CT。下面的查询只选择一个CT表:

试试这个:

select t1.TABLE_CATALOG, t1.TABLE_SCHEMA, t1.TABLE_NAME, t1.TABLE_TYPE 
from information_schema.tables as t1
inner join
(
    select table_schema+'_'+TABLE_NAME as TableName 
    from information_schema.tables 
    where TABLE_SCHEMA  <> 'cdc' 
    and table_type in ('base table','view')
) as t2
on t1.TableName LIKE t2.TableName +'%CT'
where t1.TABLE_SCHEMA = 'cdc'
order by TABLE_SCHEMA, TABLE_NAME;
试试这个:

select t1.TABLE_CATALOG, t1.TABLE_SCHEMA, t1.TABLE_NAME, t1.TABLE_TYPE 
from information_schema.tables as t1
inner join
(
    select table_schema+'_'+TABLE_NAME as TableName 
    from information_schema.tables 
    where TABLE_SCHEMA  <> 'cdc' 
    and table_type in ('base table','view')
) as t2
on t1.TableName LIKE t2.TableName +'%CT'
where t1.TABLE_SCHEMA = 'cdc'
order by TABLE_SCHEMA, TABLE_NAME;

以下仅适用于以下情况:

我正确地理解了这个问题! 你所有的桌子都以ct结尾 您可以使用“喜欢”和“不喜欢”,并添加一个%符号,表示我正在搜索以ct结尾的所有内容

与“%ct”不同的表名称将返回名称末尾没有ct的所有表

像“%ct”这样的表名称将返回名称末尾有ct的所有表

您还可以使用像“%ct%”这样的表名来返回所有包含字母ct的表。这当然是最不理想的

    select 
    TABLE_CATALOG
    ,TABLE_SCHEMA
    ,TABLE_NAME
    ,TABLE_TYPE 
from information_schema.tables 
where
    TABLE_SCHEMA in ('cdc')  and
        (table_name not like '%ct' and TABLE_SCHEMA not in ('cdc') and table_type in ('base table','view'))

order by 
    TABLE_SCHEMA, TABLE_NAME;

以下仅适用于以下情况:

我正确地理解了这个问题! 你所有的桌子都以ct结尾 您可以使用“喜欢”和“不喜欢”,并添加一个%符号,表示我正在搜索以ct结尾的所有内容

与“%ct”不同的表名称将返回名称末尾没有ct的所有表

像“%ct”这样的表名称将返回名称末尾有ct的所有表

您还可以使用像“%ct%”这样的表名来返回所有包含字母ct的表。这当然是最不理想的

    select 
    TABLE_CATALOG
    ,TABLE_SCHEMA
    ,TABLE_NAME
    ,TABLE_TYPE 
from information_schema.tables 
where
    TABLE_SCHEMA in ('cdc')  and
        (table_name not like '%ct' and TABLE_SCHEMA not in ('cdc') and table_type in ('base table','view'))

order by 
    TABLE_SCHEMA, TABLE_NAME;
试试这个, 首先,它创建一个包含所有更改表CT名称的临时表,然后尝试检查cdc模式中是否有匹配项

create table #temp(tempName varchar(1000))
GO
Insert into #temp
select a.name + '_' + b.name + '_CT' from 
sys.schemas a
left join
sys.tables b on a.schema_id = b.schema_id
where a.name != 'cdc'

select * from #temp
GO


select * from
sys.schemas a
left join
sys.tables b on a.schema_id = b.schema_id
left join 
#temp c on c.tempName = b.name
where c.tempName != null and a.name = 'cdc'

Drop table #temp
试试这个, 首先,它创建一个包含所有更改表CT名称的临时表,然后尝试检查cdc模式中是否有匹配项

create table #temp(tempName varchar(1000))
GO
Insert into #temp
select a.name + '_' + b.name + '_CT' from 
sys.schemas a
left join
sys.tables b on a.schema_id = b.schema_id
where a.name != 'cdc'

select * from #temp
GO


select * from
sys.schemas a
left join
sys.tables b on a.schema_id = b.schema_id
left join 
#temp c on c.tempName = b.name
where c.tempName != null and a.name = 'cdc'

Drop table #temp

以Zohar Peled代码为例,使用反向字符串函数使其运行更快:

on REVERSE (t1.TableName) LIKE 'TC%'

将字符串保存为concatating,像“TC%”这样的代码比像“%CT”这样的代码运行得更快。

使用反向字符串函数,将Zohar Peled代码保存得更快:

on REVERSE (t1.TableName) LIKE 'TC%'

您保存的字符串是concatating,像“TC%”比像“%CT”工作得更快

因为查询返回了多行,而我只需要cdc下的CT表,我修改了您的查询以获得输出,您能验证一下我是否正确地完成了吗?从信息模式中选择不同的t1.TABLE\U名称。tables as t1内部联接从信息模式中选择TABLE\U schema+“'''+TABLE\U名称作为TableName,其中TABLE\U模式为'cdc',TABLE\U类型为'base TABLE',反向t1.TABLE\U名称为'TC%'其中t1.TABLE\U模式为'cdc';我觉得还可以。你能测试一下Binyamin Regev的建议是否正确吗?使用反向还是不使用它真的更快?呃……两个查询几乎立即返回,您希望我比较SQL Server Mgt显示的时间吗。Studio来执行查询?不,不是真的。如果有显著的差异,我会感到惊讶。因为查询返回了多行,而我只需要cdc下的CT表,所以我修改了您的查询以获得输出,您能验证一下我是否正确完成了吗?从信息模式中选择不同的t1.TABLE\U名称。tables as t1内部联接从信息模式中选择TABLE\U schema+“'''+TABLE\U名称作为TableName,其中TABLE\U模式为'cdc',TABLE\U类型为'base TABLE',反向t1.TABLE\U名称为'TC%'其中t1.TABLE\U模式为'cdc';我觉得还可以。你能测试一下Binyamin Regev的建议是否正确吗?使用反向还是不使用它真的更快?呃……两个查询几乎立即返回,您希望我比较SQL Server Mgt显示的时间吗。Studio来执行查询?不,不是真的。如果有显著的差异,我会感到惊讶。我修改了@Zohar的查询,并添加了相反的内容,您能验证一下吗?从信息模式中选择不同的t1.TABLE\U名称。tables as t1内部联接从信息模式中选择TABLE\U schema+“'''+TABLE\U名称作为TableName,其中TABLE\U模式为'cdc',TABLE\U类型为'base TABLE',反向t1.TABLE\U名称为'TC%'其中t1.TABLE\U模式为'cdc';作为对我答案的评论,这会更好。然而,我不太确定它是否正确。确实,如果LIKE运算符仅在字符串开头后包含通配符,sql server仍然可以使用列上的任何索引,但是一旦在列名上有了反向,它就会阻止使用索引。我修改了@Zohar的查询并添加了反向,您能验证一下吗?从中选择不同的t1.TABLE_名称
information_schema.tables as t1 internal join从information_schema.tables中选择table_schema+'''.'table_NAME as TableName,其中table_schema'cdc'和table_在'base table'中键入,在t1.table_NAME的反面将'view'标记为t2。table_NAME类似于'TC%'其中t1.table_schema='cdc';作为对我答案的评论,这会更好。然而,我不太确定它是否正确。确实,如果LIKE运算符仅在字符串开头后包含通配符,那么sql server仍然可以使用列上的任何索引,但是一旦列名称出现相反的情况,它就会阻止使用索引。