查询同一服务器上的多个数据库

时间:2013-12-16 12:47:07

标签: sql sql-server

我正在寻找一种处理以下情况的方法:

  1. 我们有一个数据库服务器,上面有多个数据库(都有相同的架构,不同的数据)。

  2. 我们正在寻找一种在所有数据库中进行查询的方法(并且它易于配置,因为可以随时添加更多数据库)。此数据访问必须是实时的。

  3. 比如说,您有一个插入订单的应用程序 - 每个应用程序都有自己的数据库等。我们当时正在寻找的是一个有效的方法,然后单个应用程序访问所有其他数据库中的订单信息为了查询它并随后采取行动。

    我迄今为止的搜索并未发现太多,但我想我可能只是错过了相应的关键字才能找到正确的信息......

5 个答案:

答案 0 :(得分:17)

您必须在任何数据库对象之前指定数据库名称。

单个数据库:

SELECT * FROM [dbo].[myTable]

多个女孩:

SELECT * FROM [DB01].[dbo].[myTable]
UNION ALL
SELECT * FROM [DB02].[dbo].[myTable]
UNION ALL
SELECT * FROM [DB03].[dbo].[myTable]

答案 1 :(得分:9)

它不会是有史以来最干净的解决方案,但您可以在“主数据库”上定义一个视图(如果您的个人数据库不会保持不变),其中包含来自各个数据库的数据,并允许您在单个源上执行查询。

例如......

CREATE VIEW vCombinedRecords AS
SELECT * FROM DB1.dbo.MyTable
UNION ALL
SELECT * FROM DB2.dbo.MyTable

允许你做...

SELECT * FROM vCombinedRecords WHERE....

当您的数据库发生更改时,您只需更新视图定义以包含新表。

答案 2 :(得分:4)

您可以动态构建联合:

select name from sys.databases

然后检查数据库是否包含表:

select name from [dbname_from_above].sys.tables where name = 'YourTable'

它为您提供了联合的所有数据库。您可以构建查询客户端或动态SQL。

答案 3 :(得分:0)

查看https://www.mssqltips.com/sqlservertip/2855/sql-server-multi-database-query-with-registered-servers/

SELECT * FROM (
SELECT 
    @@SERVERNAME as [ServerName],
    @@version [Version],
    Format(@@CONNECTIONS,'N0') [Conections],
    Format(@@CPU_BUSY ,'N0')[CPUBusy]
) SQLInfo
LEFT JOIN (
    SELECT 
        @@SERVERNAME AS [ServerName],
        SERVERPROPERTY('ProductVersion') [Version Build],
        SERVERPROPERTY ('Edition') AS [Edition],
        SERVERPROPERTY('ProductLevel') AS [Service Pack],
        CASE SERVERPROPERTY('IsIntegratedSecurityOnly') 
         WHEN 0 THEN 'SQL Server and Windows Authentication mode'
         WHEN 1 THEN 'Windows Authentication mode'
        END AS [Server Authentication],
        CASE SERVERPROPERTY('IsClustered') 
         WHEN 0 THEN 'False'
         WHEN 1 THEN 'True'
        END AS [Is Clustered?],
        SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS [Current Node Name],
        SERVERPROPERTY('Collation') AS [ SQL Collation],
        [cpu_count] AS [CPUs],
        [physical_memory_kb]*0.00000095367432 AS [RAM (GB)]
    FROM [sys].[dm_os_sys_info]
) SQLInfo2 on SQLInfo.[ServerName]=SQLInfo2.[ServerName]
LEFT JOIN (
    SELECT 
        @@SERVERNAME as [ServerName],
        NodeName,
        Status_Description,
        is_Current_Owner
    FROM [MASTER].[sys].[fn_virtualservernodes]()
)Clusterinfo on SQLInfo.[ServerName]=Clusterinfo.[ServerName]

答案 4 :(得分:-1)

在这里从臀部射击。

use master;
go

create table #Temp (sourceDBName varchar(128), colA varchar(128), colB varchar(128));

exec sp_MSforeachDB ' USE [?];

insert into #Temp
SELECT DISTINCT
 ''?'',
tableA.colA,
tableB.colB
FROM tableA JOIN tableB on some_conditions
WHERE someCol LIKE ''%some_term%''
'

select sourceDBName, colA, colB from #Temp order by 1, 2, 3;

drop table #Temp;

此逻辑应允许您将单个查询应用于所有数据库。但是,要使用它,您将需要添加逻辑以过滤掉系统数据库,或显式地仅包括您指定的数据库。为此,您可能希望将此逻辑放入存储过程中,然后返回一个结果集,因此最后,对该逻辑的调用是一个select语句,该语句返回一个行集,可以连接,过滤等。