看起来很愚蠢,但是仍然可以通过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
我希望它返回创建新视图的结果。
预先感谢
答案 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'