如何通过SQL查询检查远程服务器上是否存在数据库

时间:2016-06-22 16:35:25

标签: sql-server database remote-server

我在SQL Server 2012中有一个表格如下。

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

有没有办法只返回表中提到的服务器名称上存在数据库的行?

我在论坛中搜索了答案,但却找不到答案。我知道存在一个如here所述的查询,它检查该服务器上的数据库是否存在。 但在我的情况下,我希望它成为where子句的一部分。

另外,请注意,此表位于服务器1中,但表中的服务器可能彼此不同。

2 个答案:

答案 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;

答案 1 :(得分:1)

  

有没有办法只返回表中提到的服务器名称上存在数据库的行?

     

我希望它成为where子句的一部分。

如果我正确理解您的问题,您可以使用where exists

e.g。 (您需要将server1作为来自运行查询的服务器的链接服务器)

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