单个查询从一个数据库中的多个表中获取数据

BBa*_*LBL 3 sql-server t-sql

我有 36 个 Microsoft SQL Server VM,每个都有一个以 _Sec 结尾的特定数据库作为数据库名称。该数据库中有 2 个表,我需要在单个查询中从中获取数据:tblConnGroupstblConnGroupsDet.

tblConnGroups 有 3 列我需要包含在结果中

tblConnGroups.ID
tblConnGroups.GroupName
tblConnGroups.Provisional
Run Code Online (Sandbox Code Playgroud)

tblConnGroupsDet 结果中基本上有一个列。

tblConnGroupsDet.GroupID
tblConnGroupsDet.DBName
Run Code Online (Sandbox Code Playgroud)

tblConnGroups.ID是在使用的密钥tblConnGroupsDet.GroupID,然而,在tblConnGroupsID领域具有一对多的关系到GroupID在字段tblConnGroupsDet

Connection Group Name 只出现在tblConnGroups带有它的ID, 和其他信息中,但是GroupID将出现在tblConnGroupsDet带有成员数据库名称的每一行中。

USE [Name_Sec];
GO
SELECT ID,Groupname,Provisional 
from [tblConnGroups] 
ORDER BY ID ASC

ID   GroupName       Provisional
514  Name_FY0910     0
844  Name_FY1011     0
1588 NameTest_FY1516 1

USE [Name_Sec];
GO
SELECT GroupID,DBName 
FROM [tblConnGroupsDet] 
ORDER BY GroupID ASC

GroupID  DBNAME
514      Name_Base
514      Name_FY0910
514      Name_State0910
514      Name_portal
514      Name_FY1011
Run Code Online (Sandbox Code Playgroud)

我尝试了几个不同的连接查询来匹配tblConnGroups.IDtblConnGroupsDet.GroupID,但还没有完全弄清楚如何从这两个表中获取我想要的信息。

基本上,我需要一个查询,这将使我这些结果在那里GroupName会得到重复每个DBName地方的ID/GroupID比赛:

GroupName,DBName,FileSystemPath
Run Code Online (Sandbox Code Playgroud)

我希望这比泥泞更清楚,我没有做很多 DB Admin 工作,我们一直在寻找 DBA,这是我不经常戴的帽子。

Han*_*non 5

SSMS 有一个称为服务器组的功能,它允许使用该功能。

在此处输入图片说明

如上图所示,添加一个新的服务器组,然后将每个目标 SQL Server 添加到该组中。

然后右键单击新创建的组,并选择“新建查询”。在查询窗口中输入以下内容:

DECLARE @cmd nvarchar(max);
SET @cmd = '';
SELECT @cmd = @cmd + 'USE ' + QUOTENAME(d.name) + ';
SELECT SECDB = ''' + d.name + '''
    , g.*
    , gd.*
FROM dbo.tblConnGroups g
    INNER JOIN dbo.tblConnGroupsDet gd ON g.ID = gd.GroupID
ORDER BY gd.GroupID, gd.DBName;
'
FROM sys.databases d
WHERE d.name LIKE '%_Sec';

EXEC sys.sp_executesql @cmd;
Run Code Online (Sandbox Code Playgroud)

上面的代码将针对组中所有 SQL Server 上名为 *_Sec 的任何/所有数据库动态执行您的查询。