56

I want to be able to programmatically (in T-SQL) check if a specific linked server already exists for my current server and database (so that if the link doesn't exist yet, I can create it). I tried stuff like this:

IF OBJECT_ID('myserver\devdb_1') IS NULL
BEGIN
  PRINT 'Does not exist, need to create link'
  EXEC master.dbo.sp_addlinkedserver @server = N'myserver\devdb_1', 
                                     @srvproduct=N'SQL Server'
END
ELSE
  PRINT 'Link already exists'

But the OBJECT_ID test always returns null, even if the link already exists. Any way to do this check in T-SQL, so that the rest of my code can assume the link always exists?

SteveC
  • 15,808
  • 23
  • 102
  • 173
Ogre Psalm33
  • 21,366
  • 16
  • 74
  • 92

2 Answers2

105

Check in sys.servers:

if not exists(select * from sys.servers where name = N'myserver\devdb_1')
SteveC
  • 15,808
  • 23
  • 102
  • 173
Remus Rusanu
  • 288,378
  • 40
  • 442
  • 569
28
IF NOT EXISTS ( SELECT TOP (1) * FROM sysservers WHERE srvname = 'myserver\devdb_1' )
seebiscuit
  • 4,905
  • 5
  • 31
  • 47
Jorge Ferreira
  • 96,051
  • 25
  • 122
  • 132
  • Essentially, nearly the same answer as Remus Rusanu, I up-voted you both, but gave him the check for including the link. ;-) – Ogre Psalm33 Jun 23 '10 at 18:10
  • Interesting. What's the diff between `sysservers` and `sys.servers`. I noticed that the column names are different! – seebiscuit Mar 05 '18 at 17:38
  • 3
    @seebiscuit The first is a table and considered 'the old way', the second is a system view which is the recommended approach. https://learn.microsoft.com/en-us/sql/relational-databases/system-tables/mapping-system-tables-to-system-views-transact-sql – Joe C Mar 05 '18 at 17:44