繁体   English   中英

从具有特定名称的所有数据库的所有表中选择

[英]Select from all tables in all databases with specific name

我需要查询服务器上所有数据库中具有特定名称的所有表。 数据库每天由ISA创建,其名称由掩码ISALOG_ current_date _WEB_000生成。 每个数据库都包含表WebProxyLog 数据库总数为60。我的目标是在所有数据库或特定日期的数据库中查询WebProxyLog表。 类似于foreach循环:

foreach($db in $databases)
{
   if($db.Name.Contains("_web"))
    {
     SELECT [ClientUserName],[logTime],[uri],[UrlDestHost],[bytesrecvd],[bytessent],[rule]
     FROM [$db].[dbo].[WebProxyLog]
     WHERE [ClientUserName] like ''%username%''
    }
}

如果查询结果将合并到单个表或视图中,则非常理想。 有办法执行吗?

有一个未记录的存储过程,称为sp_MSForEachDB,但是,我不会急于使用未记录的功能。 这可以通过使用从sys.DataBases系统表获取数据库名称的动态SQL来完成:

DECLARE @SQL nvarchar(max) = N''


SELECT @SQL = @SQL + 
'UNION ALL 
     SELECT ['+ name +'] As DBName, [ClientUserName],[logTime],[uri],[UrlDestHost],[bytesrecvd],[bytessent],[rule]
     FROM [' + name + '].[dbo].[WebProxyLog]
     WHERE [ClientUserName] like ''%username%''

'
FROM sys.DataBases 
WHERE name LIKE '%ISALOG%WEB%'

SET @SQL = STUFF(@SQL, 1, 10, '') + ' ORDER BY DBName'

PRINT @SQL

--EXEC(@SQL)

一旦打印了sql并对其进行了测试,就可以删除print行并取消对exec行的注释。

进一步阅读-亚伦·贝特朗(Aaron Bertrand)的不良习惯:依赖未记录的行为,以及对关于sp_MSForEachDB的问题的回答

编辑:SELECT的小更正:

'UNION ALL 
 SELECT [ClientUserName],[logTime],[uri],[UrlDestHost],[bytesrecvd],[bytessent],[rule]
 FROM [' + name + '].[dbo].[WebProxyLog]
 WHERE [ClientUserName] like ''%username%''
'

结果将查询列表打印到表中,对不对?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM