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

时间:2017-01-30 07:19:23

标签: sql sql-server sql-server-2008 tsql

我需要在服务器上的所有数据库中查询具有特定名称的所有表。 数据库每天由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%''
    }
}

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

1 个答案:

答案 0 :(得分:3)

有一个名为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的Bad habits to kick : relying on undocumented behaviorhis answer关于sp_MSForEachDB的问题。

编辑:SELECT的小修正:

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

结果它会打印查询列表,对吗?