복붙노트

[SQL] sp_MSforeachdb : 결과 만에 데이터베이스에서 결과를 포함

SQL

sp_MSforeachdb : 결과 만에 데이터베이스에서 결과를 포함

나는 간단한 명령으로 아래의 저장 프로 시저 sp_MSforeachdb를 실행하고 있습니다. 내 질문은 적어도 1 기록 명령을 만족가있는 경우에만 데이터베이스를 표시하는 결과를 제한하는 방법입니다 :

여기 내 저장 프로 시저입니다 :

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를 수정할 수 있습니까?

해결법

  1. ==============================

    1.음, 첫째, sp_MSforEachDb 사용을 중지. 아, 문제는 (당신이 증명하려면 여기를 참조).

    음, 첫째, sp_MSforEachDb 사용을 중지. 아, 문제는 (당신이 증명하려면 여기를 참조).

    방법에 대해 :

    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;
    

    당신이 정말로 알 수없는, 별도의 결과 집합의 임의의 수를 원하는 경우에, 변화는 간단하다.

    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;
    
  2. ==============================

    2.당신은 기본적으로 데이터 만이 존재하는 경우 선택 실행하는 또 다른 IF가 필요합니다. 여기에 내가 시험에 무슨 짓을했는지.

    당신은 기본적으로 데이터 만이 존재하는 경우 선택 실행하는 또 다른 IF가 필요합니다. 여기에 내가 시험에 무슨 짓을했는지.

    DB1에서 :

    create table mytesttable(a int)
    insert mytesttable values(1)
    

    DB2의 경우 :

    create table mytesttable(a int)
    

    당신이하지에 반환 결과 DB1하지만, DB2를 원하는 그래서. 다음과 같은 SQL을 사용할 수 있습니다 :

    EXECUTE master.sys.sp_MSforeachdb 'USE [?]; 
    
    IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_NAME = ''mytesttable''))
    BEGIN
    
    IF EXISTS (SELECT 1 FROM mytesttable) BEGIN
        SELECT ''?'' as dbname,T.A
        FROM mytesttable AS T
    END
    END
    '
    

    이 경우에만 반환 : DB1, 1

  3. from https://stackoverflow.com/questions/20131930/sp-msforeachdb-only-include-results-from-databases-with-results by cc-by-sa and MIT license