怎么在实例上的所有数据库上运行相同的查询?

本教程将介绍如何在实例上的所有数据库上运行相同的查询?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么在实例上的所有数据库上运行相同的查询? 教程 第1张

问题描述

我(出于测试目的)在 sql server 2008 r2 实例上有许多具有相同架构(= 基本上相同的表和列)的数据库.

我想要一个类似的查询

SELECT COUNT(*) FROM CUSTOMERS

在实例上的所有数据库上.我希望有 2 列作为结果:

1 - 数据库名称

2 - COUNT(*)

例子:

DBName  //COUNT (*)

TestDB1 // 4

MyDB  // 5

etc...

注意:我假设 CUSTOMERS 表存在于所有数据库中(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 ' + QUOTENAME(name, '''') + ', COUNT(1) FROM ' + QUOTENAME(name) + '.' + QUOTENAME(@TableName)
  FROM sys.databases 
  WHERE OBJECT_ID(QUOTENAME(name) + '.' + QUOTENAME(@TableName)) IS NOT NULL
  FOR XML PATH(''), TYPE).value('text()[1]', '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

好了关于怎么在实例上的所有数据库上运行相同的查询?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。