如何通过 SQL 查询检查远程服务器上是否存在数据库
How to check if database exist on Remote Server through SQL query
我在 SQL Server 2012 中有一个 table 如下。
|---------------------|------------------|------------------|
| ClientName | servername |Databasename |
|---------------------|------------------|------------------|
| c1 | s1 | b1 |
| c2 | s2 | b2 |
| c3 | s4 | b4 |
| c4 | s5 | b6 |
|---------------------|------------------|------------------|
有没有办法 return 只有 table 中提到的服务器名称上存在数据库的行?
我在论坛中搜索了答案,但找不到。我知道存在一个查询 here ,它检查该服务器上的数据库是否存在。 但就我而言,我希望它成为 where 子句的一部分。
此外,请注意,此 table 在服务器 1 中,但 table 中的服务器可能彼此不同。
因此,我假设您已经链接了所有服务器并且您使用了一个可以读取架构的帐户。脚本将是这样的:
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;
Is there a way to return only rows for which database exists on the server names mentioned in the table?
I want it to be part of where clause.
如果我理解正确你的问题,你可以使用where exists
例如(您需要 server1
作为来自您 运行 查询的服务器的链接服务器)
select * from
schema.yourTable
where exists (select 1 from Server1.dbname.schemaName.yourServerList
where DatabaseName = 'b1')
我在 SQL Server 2012 中有一个 table 如下。
|---------------------|------------------|------------------|
| ClientName | servername |Databasename |
|---------------------|------------------|------------------|
| c1 | s1 | b1 |
| c2 | s2 | b2 |
| c3 | s4 | b4 |
| c4 | s5 | b6 |
|---------------------|------------------|------------------|
有没有办法 return 只有 table 中提到的服务器名称上存在数据库的行?
我在论坛中搜索了答案,但找不到。我知道存在一个查询 here ,它检查该服务器上的数据库是否存在。 但就我而言,我希望它成为 where 子句的一部分。
此外,请注意,此 table 在服务器 1 中,但 table 中的服务器可能彼此不同。
因此,我假设您已经链接了所有服务器并且您使用了一个可以读取架构的帐户。脚本将是这样的:
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;
Is there a way to return only rows for which database exists on the server names mentioned in the table?
I want it to be part of where clause.
如果我理解正确你的问题,你可以使用where exists
例如(您需要 server1
作为来自您 运行 查询的服务器的链接服务器)
select * from
schema.yourTable
where exists (select 1 from Server1.dbname.schemaName.yourServerList
where DatabaseName = 'b1')