具有n个数据库的独特联接SQL

时间:2019-05-22 18:39:25

标签: sql sql-server

看起来很愚蠢,但是仍然可以通过SQL进行工作,而且我无法写出内容。

这里是场景:我有许多SQL Server,其中有多个数据库。我需要搜索每个数据库,如果有表,则返回结果,然后将这些结果与辅助数据库一起添加。

我还需要每个表都存在的数据库名称。

查询#1,该查询返回重要数据

SELECT DISTINCT 
    datafeed_id AS 'Datafeed ID', 
    MAX(start_time) AS 'Start Time', 
    MAX(end_time) AS 'End Time', 
    MAX(status_id) AS 'Status',
    MAX(DATEDIFF(mi, [start_time], [end_time])) AS 'Run Time'
FROM 
    dbo.tblDataFeedHistory
GROUP BY
    datafeed_id

查询2,它返回我需要的信息Supporting Query1。请注意,我在这里分别调用每个数据库,但可能没有n个数据库

CREATE OR ALTER VIEW [vAllDatabasesDataFeedResult] 
AS
    SELECT
        Name = 'Instance',
        [datafeed_name], [status], [is_active]
    FROM 
        instance.dbo.tblDatafeed

    UNION ALL

    SELECT
        Name = 'Instance1',
        [datafeed_name], [status], [is_active] 
    FROM
        Instance2.dbo.tblDataFeed;

如果它们包含表dbo.tblDataFeed,我想从SQL中所有数据库的输出中看到什么

| Database Name | Datafeed_name | Is_active | Status | Start_time | End_Time | Status_id | Runtime

我希望它返回创建新视图的结果。

预先感谢

1 个答案:

答案 0 :(得分:0)

可以使用sp_MSForEachDB。 在下面的示例中,我可能有10个数据库。其中两个拥有我的周期性“ LogEntry”表。如果我想获取每个数据库的行数,可以使用以下内容。

注意,我必须检查表上的“是否存在”,否则查询将在没有表的数据库上失败。

代替SELECT,我还可以将计数推到汇总的数据库/表/列中。

您可以执行任何操作,关键是sp_MSForEachDB调用。

EXECUTE sp_MSForEachDB 
        'USE ?;         IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = ''dbo''
                 AND  TABLE_NAME = ''LogEntry''))
BEGIN
    Select DB_NAME() AS DBName , COUNT(*) from dbo.LogEntry
END'