如何在一个实例上的所有数据库上运行相同的查询?
在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