I have a table as following in SQL Server 2012.
|---------------------|------------------|------------------|
| ClientName | servername |Datab
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.
If I understand your question correctly, you can use where exists
e.g. (you need to have server1
as linked server from the server that you are running the query from)
select * from
schema.yourTable
where exists (select 1 from Server1.dbname.schemaName.yourServerList
where DatabaseName = 'b1')
So, I assume you already have all your server linked and you used an account, which can read the schema. Than script will be something like this:
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;