sp_MSforeachdb:只包括来自有结果的数据库的结果 [英] sp_MSforeachdb: only include results from databases with results

查看:15
本文介绍了sp_MSforeachdb:只包括来自有结果的数据库的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个简单的命令运行以下存储过程 sp_MSforeachdb.我的问题是如何将结果限制为仅显示至少有 1 条记录满足命令的数据库:

I'm running the below stored procedure sp_MSforeachdb with a simple command. My question is how to limit the result to show only the databases that have at least 1 record satisfying the command:

这是我的存储过程:

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; 

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_NAME = ''Tabs''))
BEGIN

SELECT ''?'' as dbname,T.TabName, T.TabPath
FROM Tabs T
WHERE T.TabID IN (

SELECT Distinct TM.TabID
FROM TabModules TM
WHERE mID IN (
  ...
  )

)
ORDER BY T.TabName
END
'

有什么想法可以修改 sp 以使其不显示具有空结果的数据库(见图)?

Any ideas how I can modify the sp so that it doesn't display the databases that have empty results (see image)?

推荐答案

好吧,首先,停止使用 sp_MSforEachDb.哦,问题(如果你想要证据,请参阅 此处).

Well, first, stop using sp_MSforEachDb. Oh, the problems (if you want proof, see here).

怎么样:

DECLARE @cmd NVARCHAR(MAX) = N'', @sql NVARCHAR(MAX) = N'';

SELECT @cmd += N'IF EXISTS (SELECT 1 FROM '
  + QUOTENAME(name) + '.sys.tables WHERE name = N''Tabs'')
  SET @sql += N''UNION ALL 
    SELECT ''''' + name + ''''',T.TabName
    FROM ' + QUOTENAME(name) + '.dbo.Tabs AS T
    WHERE EXISTS 
    (
      SELECT 1 FROM ' + QUOTENAME(name) + '.dbo.TabModules AS TM
        WHERE TM.TabID = T.TabID
        AND TM.mID IN -- this should probably be exists too
        ( 
          ...
        )
    )
'''
FROM sys.databases 
  WHERE state = 0 -- assume you only want online databases
  AND database_id > 4; -- assume you don't want system dbs

EXEC sp_executesql @cmd, N'@sql NVARCHAR(MAX) OUTPUT', @sql OUTPUT;

SET @sql = STUFF(@sql, 1, 10, '') + N' ORDER BY TabName;';   

PRINT @sql; -- this will appear truncated, but trust me, it is not truncated
-- EXEC sp_executesql @sql;

如果你真的想要一些未知的、任意数量的独立结果集,改变很简单.

If you really want some unknown, arbitrary number of separate resultsets, the change is simple.

DECLARE @cmd NVARCHAR(MAX) = N'', @sql NVARCHAR(MAX) = N'';

SELECT @cmd += N'IF EXISTS (SELECT 1 FROM '
  + QUOTENAME(name) + '.sys.tables WHERE name = N''Tabs'')
  SET @sql += N''SELECT ''''' + name + ''''',T.TabName
    FROM ' + QUOTENAME(name) + '.dbo.Tabs AS T
    WHERE EXISTS 
    (
      SELECT 1 FROM ' + QUOTENAME(name) + '.dbo.TabModules AS TM
        WHERE TM.TabID = T.TabID
        AND TM.mID IN -- this should probably be exists too
        ( 
          ...
        )
    )
 ORDER BY T.TabName;
 '';'
FROM sys.databases 
  WHERE state = 0 -- assume you only want online databases
  --AND database_id > 4; -- assume you don't want system dbs

EXEC sp_executesql @cmd, N'@sql NVARCHAR(MAX) OUTPUT', @sql OUTPUT;

PRINT @sql; -- this will appear truncated, but trust me, it is not truncated
-- EXEC sp_executesql @sql;

这篇关于sp_MSforeachdb:只包括来自有结果的数据库的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆