Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

sp_MSforeachdb:chỉ bao gồm kết quả từ cơ sở dữ liệu với kết quả

Tốt, trước tiên, hãy ngừng sử dụng sp_MSforEachDb . Ồ, vấn đề (nếu bạn muốn bằng chứng, hãy xem tại đây ).

Làm thế nào về:

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;

Nếu bạn thực sự muốn một số tập kết quả riêng biệt không xác định, tùy ý, thì thay đổi rất đơn giản.

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tải tệp XML phân cấp khổng lồ (nhưng đơn giản) vào một bảng SQL

  2. Làm thế nào để triển khai SQL Server Compact Edition 4.0?

  3. Tham số Sniffing (hoặc Spoofing) trong SQL Server

  4. SQL Server và mất kết nối khi đang giao dịch

  5. Sau khi bế tắc một giao dịch trên các phiên bản SQL Server