Sql 用于选择表名的正则表达式
SQL Server 2012 以下查询获取容器数据库中存在的所有架构和对应表: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
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仍然可以使用列上的任何索引,但是一旦列名称出现相反的情况,它就会阻止使用索引。