Question

I need to test if a table exists in a linked server, where linked server is a parameter (it has to be), that's why I'm using exec method. I tried many ways but I didn't succeed.

Declare @LinkedServerName varchar(50)
Declare @DS varchar(50)
Declare @username varchar(50)
Declare @pswd varchar(12)
Declare @TableExists int

Set @DS = 'test\TestDB'
Set @LinkedServerName = 'LinkedServerAutoAddDrop'
Set @username = 'ua'
Set @pswd = 'pass'
Set @TableExists = 0

if not exists(select * from sys.servers where name = @LinkedServerName)
BEGIN
    EXEC sp_addlinkedserver   
       @server=@LinkedServerName, 
       @srvproduct='',
       @provider='SQLNCLI', 
       @datasrc=@DS

    EXEC sp_addlinkedsrvlogin @LinkedServerName, N'false', NULL, @username, @pswd
    exec sp_serveroption @server=@LinkedServerName, @optname='rpc', @optvalue='TRUE'
    exec sp_serveroption @server=@LinkedServerName, @optname='rpc out', @optvalue='TRUE'
END


exec('IF (EXISTS (SELECT * FROM OPENQUERY([' + @LinkedServerName + '], ''select * from LinkedDB.INFORMATION_SCHEMA.TABLES Where TABLE_NAME = ''''TableName'''''')))
BEGIN
    exec (''Set ' + @TableExists + ' = 1'')

END')

IF (@TableExists = 1)
BEGIN
    exec('Insert Into ...')
END
Was it helpful?

Solution

I personally would use sp_executesql along with an output parameter for this:

DECLARE @SQL NVARCHAR(MAX) = ''
DECLARE @TableExists BIT;

SET @SQL = 'SELECT @TableExists = CASE WHEN TableExists = 0 THEN 0 ELSE 1 END
            FROM OPENQUERY(' + QUOTENAME(@LinkedServerName) 
            + ', ''SELECT TableExists = COUNT(*) 
                    FROM LinkedDB.INFORMATION_SCHEMA.TABLES
                    WHERE TABLE_NAME = ''''TableName'''''');';

EXECUTE sp_executesql @SQL, N'@TableExists BIT OUTPUT', @TableExists OUT;

IF (@TableExists = 1)
BEGIN
    -- DO SOMETHING
END;

OTHER TIPS

TO Check If Column Exist Or Not I Use following:

If Returns 1 then COLUMN EXIST Else If 0 then COLUMN DOSE NOT EXIST

If Database On same Server then Provide @ServerName as Empty Field ('')

CREATE PROCEDURE [dbo].[udsp_CheckIfColumExist](@DBName Varchar(1000),@ColName Varchar(1000),@TableName Varchar(1000),@ServerName Varchar(1000))AS

DECLARE @SqlStr VARCHAR(MAX) = ''
IF @ServerName <> ''
    SET @ServerName = '['+@ServerName+'].'
    SET  @SqlStr ='SELECT  COUNT(1) IsExist  FROM '+ @ServerName + @DBName+'.sys.columns 
            c join '+ @ServerName + @DBName +'.sys.tables t on t.OBJECT_ID = c.OBJECT_ID
            WHERE c.name = N'''+@ColName +''' AND t.name = N''' +@TableName +''''
     EXEC(@SqlStr)

If you want to perform same check on table remove column part from query.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top