2016-02-29 2 views
1

Мне нужно найти все базы данных на связанном сервере с тем же значением внутри определенной таблицы, как база данных на исходном сервере, которая вызывает запрос.Как найти базы данных, имеющие определенную таблицу на связанном сервере (SQL Server 2012)?

Я построил запрос, который работает нормально, если все базы данных на связанном сервере имеют эту таблицу. В противном случае он не говорил мне:

The OLE DB provider "SQLNCLI11" for linked server "MyServer" does not contain the table ""DbName"."dbo"."TableName"". The table either does not exist or the current user does not have permissions on that table.

Это мой код:

CREATE TABLE #x(DB SYSNAME, name varchar(255)); 

DECLARE @guid uniqueidentifier; 
SET @guid = (SELECT guid FROM TableName); 

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N''; 

SELECT @sql = @sql + 'IF EXISTS (SELECT 1 FROM [LinkedServer].' 
+ QUOTENAME(name) + '.sys.tables WHERE name = ''TableName'') 
INSERT #x SELECT ''' + name + ''', name 
    FROM [LinkedServer].' + QUOTENAME(name) + '.dbo.TableName 
    WHERE guid = ''' + CONVERT(NVARCHAR(36), @guid) + ''';' 
FROM [LinkedServer].master.sys.databases; 

EXEC sp_executesql @sql; 

SELECT * FROM #x; 
DROP TABLE #x; 

Есть ли способ решить эту проблему?

ответ

1

, так как вы не знаете, существует ли таблица в конкретной базе данных во время компиляции, вы должны использовать динамический SQL:

SELECT @sql += ' 
    IF EXISTS (SELECT 1 FROM [LinkedServer].' + QUOTENAME(name) + '.sys.tables WHERE name = ''TableName'') 
exec (''INSERT #x SELECT ''''' + name + ''''', name 
    FROM [LinkedServer].' + QUOTENAME(name) + '.dbo.TableName 
    WHERE guid = ''''' + CONVERT(NVARCHAR(36), @guid) + ''''''');' 
FROM [LinkedServer].master.sys.databases; 
where database_id > 4 

так у вас есть динамический внутри динамической.

+0

Что произойдет, если связанный сервер не имеет «master» DB (т. Е. Не является SQL Server)? –

+0

Это не проблема в моем случае - это всегда SQL Server с мастер-БД. Но @Ivan, вы проверили свое решение? Я попытался адаптировать это, но я получаю сообщение об ошибке: «Неверный синтаксис рядом с« TableName ».» – vso

+0

@vso, проверьте кавычки. 'print @ sql' для отладки. –