Instead of the undocumented and unsupported sp_MSforeachdb
procedure, consider building a batch with USE
statements for each database and conditionally execute the query only when the table exists in the database.
:CONNECT Server_A
DECLARE @SQL nvarchar(MAX) = (
SELECT STRING_AGG(N'USE ' + QUOTENAME(name) + CAST(N';
IF OBJECT_ID(N''dbo.Fty'') IS NOT NULL
BEGIN
SELECT * FROM Fty WHERE name LIKE ''%Test%'';
END
' AS nvarchar(MAX)),';')
FROM sys.databases
);
EXEC sp_executesql @SQL;
GO
Pre-SQL Server 2017 where STRING_AGG is unavailable, use FOR XML for aggregate string concatenation:
DECLARE @SQL nvarchar(MAX) = STUFF((
SELECT N';
USE ' + QUOTENAME(name) + CAST(N';
IF OBJECT_ID(N''dbo.Fty'') IS NOT NULL
BEGIN
SELECT * FROM Fty WHERE name LIKE ''%Test%'';
END' AS nvarchar(MAX))
FROM sys.databases
FOR XML PATH(''), TYPE
).value('text()[1]', 'nvarchar(MAX)'),1,1,'') + ';';
EXEC sp_executesql @SQL;
GO