2016-06-22 2 views
0

У меня есть таблица следующим образом в SQL Server 2012.Как проверить, если база данных существует на удаленном сервере через SQL запрос

|---------------------|------------------|------------------| 
|  ClientName  |  servername |Databasename  | 
|---------------------|------------------|------------------| 
|   c1   |   s1  |   b1  | 
|   c2   |   s2  |   b2  | 
|   c3   |   s4  |   b4  | 
|   c4   |   s5  |   b6  | 
|---------------------|------------------|------------------| 

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

Я искал в форумах ответы, но не смог их получить. Я знаю, что существует запрос, упомянутый here, который проверяет наличие базы данных на этом сервере или нет. Но в моем случае я хочу, чтобы это было частью предложения.

Также учтите, что эта таблица находится на сервере 1, но серверы в таблице могут отличаться друг от друга.

+0

WHERE EXISTS (ваш удаленный запрос здесь). Имейте в виду, что, поскольку вы сохраняете все имена объектов в таблице, вам придется использовать динамический sql для этого. –

+0

@SeanLange «ваш удаленный запрос здесь» - это запрос, который я ищу. :) – atp9

+0

Я думаю, что чего-то не хватает. Что вы здесь делаете? –

ответ

2

Итак, предположим, что у вас уже есть весь ваш сервер, и вы использовали учетную запись, которая может читать схему. Чем скрипт будет выглядеть примерно так:

SELECT TOP 0 * INTO #tbl_Server_DBs 
FROM tbl_Server_DBs 

DECLARE ServerDBs CURSOR LOCAL STATIC FORWARD_ONLY 
FOR SELECT ClientName, servername, Databasename FROM tbl_Server_DBs 

DECLARE @ClientName NVARCHAR(128), @servername NVARCHAR(128), @Databasename NVARCHAR(128); 
DECLARE @s NVARCHAR(4000) 

OPEN ServerDBs 
FETCH NEXT FROM ServerDBs 
INTO @ClientName, @servername, @Databasename 

WHILE (@@fetch_status <> -1) 
BEGIN 
    SET @s = N'SELECT ''' + @ClientName + N''', ''' + @servername + N''', name 
     FROM [' + @servername + N'].sys.databases 
     WHERE name = ''' + @Databasename + N''';'; 

    PRINT @s 
    INSERT INTO #tbl_Server_DBs (ClientName, servername, Databasename) 
    EXEC(@s); 

    FETCH NEXT FROM ServerDBs 
    INTO @ClientName, @servername, @Databasename 
END 

CLOSE ServerDBs 
DEALLOCATE ServerDBs 

SELECT * FROM #tbl_Server_DBs; 
+0

Спасибо. Кажется, мне придется писать SP или Function, я искал это решение, чтобы быть частью предложения where, но, я думаю, это невозможно. Один из способов, я думаю, добавить его как часть предложения where - определение функции и вызов ее в разделе where, но опять же, каждое считывание данных вызовет вызов функции, который может увеличить служебные данные. Но, еще раз спасибо. – atp9

+0

Потенциально вы можете получить его в одном запросе или в представлении, но это означает, что у вас есть жестко запрограммированные имена серверов. В случае каких-либо проблем с подключением ваш запрос не будет выполнен. Кроме того, вы можете добавить столько серверов, сколько хотите, без изменения кода. –

1

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

Я хочу, чтобы это было частью предложения.

Если я правильно понимаю ваш вопрос, вы можете использовать where exists

например (Вы должны иметь server1 как связанный сервер с сервера, на котором выполняется запрос с)

select * from 
schema.yourTable 
where exists (select 1 from Server1.dbname.schemaName.yourServerList 
       where DatabaseName = 'b1')