如何在一个实例上的所有数据库上运行相同的查询?

在sql server 2008 r2实例中,我有(用于testing目的)具有相同模式(=基本上相同的表和列)的许多dbs。

我想要一个类似的查询

SELECT COUNT(*) FROM CUSTOMERS 

在实例上的所有DB上。 我想结果2列:

1 – 数据库名称

2 – COUNT(*)的值

例:

 DBName // COUNT (*) TestDB1 // 4 MyDB // 5 etc... 

注意:我假定CUSTOMERS表存在于所有dbs(除master )之外。

试试这个 –

 SET NOCOUNT ON; IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL DROP TABLE #temp CREATE TABLE #temp ( [COUNT] INT , DB VARCHAR(50) ) DECLARE @TableName NVARCHAR(50) SELECT @TableName = '[dbo].[CUSTOMERS]' DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = STUFF(( SELECT CHAR(13) + 'SELECT ''' + name + ''', COUNT(1) FROM [' + name + '].' + @TableName FROM sys.databases WHERE OBJECT_ID(name + '.' + @TableName) IS NOT NULL FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') INSERT INTO #temp (DB, [COUNT]) EXEC sys.sp_executesql @SQL SELECT * FROM #temp t 

输出(例如,在AdventureWorks ) –

 COUNT DB ----------- -------------------------------------------------- 19972 AdventureWorks2008R2 19975 AdventureWorks2012 19472 AdventureWorks2008R2_Live 

直接查询

 EXECUTE sp_MSForEachDB 'USE ?; SELECT DB_NAME()AS DBName, COUNT(1)AS [Count] FROM CUSTOMERS' 

这个查询会告诉你你想看到什么,但是也会为每个没有名为“CUSTOMERS”的表的数据库抛出错误。 你需要制定一个逻辑来处理这个问题。

拉吉

怎么样这样的事情:

 DECLARE c_db_names CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN('master', 'tempdb') --might need to exclude more dbs OPEN c_db_names FETCH c_db_names INTO @db_name WHILE @@Fetch_Status = 0 BEGIN EXEC(' INSERT INTO #report SELECT ''' + @db_name + ''' ,COUNT(*) FROM ' + @db_name + '..linkfile ') FETCH c_db_names INTO @db_name END CLOSE c_db_names DEALLOCATE c_db_names SELECT * FROM #report