본문 바로가기
프로그래밍/TSQL

[MSSQL] 링크드서버(원격서버) DB인스턴스, 테이블 존재 유무 판단

by 정리 습관(★arranging★) 2022. 8. 9.
728x90

 

링크드 서버가 아닌 해당 데이터베이스 내에서의 인스턴스 존재 유무, 테이블 존재 유무 확인은

DB인스턴스의 경우 SYS.SYSDATABASES 에서 조회

테이블의 경우 [DB].DBO.SYSOBJECTS / [DB].INFORMATION_SCHEMA.TABLES 에서 조회 하여 확인이 가능합니다.

 

EX)

IF EXISTS (SELECT * FROM SYS.SYSDATABASES WHERE NAME = 'TEST')
PRINT 'EXISTS'
ELSE
PRINT 'NOT EXISTS'

IF EXISTS (SELECT * FROM TEST.DBO.SYSOBJECTS WHERE NAME = 'TEST' AND TYPE ='U')
PRINT 'EXISTS'
ELSE
PRINT 'NOT EXISTS'

IF EXISTS (SELECT * FROM TEST.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TEST')
PRINT 'EXISTS'
ELSE
PRINT 'NOT EXISTS'


하지만 링크드서버(원격서버)의 DB인스턴스, 테이블 존재 유무 판단을 하기위해서는 다른 방법을 사용해야합니다.
특히 인스턴스가 없는경우에는 쿼리로 확인이 안됩니다.
이때는 확인을 위한 별도 SP를 생성하고 해당 SP내에서 TRY CATCH를 통해 판단이 가능합니다.

SP

ALTER PROC SP_DB_TBL_EXISTS
    @SERVER_PATH   VARCHAR(100),
    @DB  VARCHAR(200),
    @TABLE  VARCHAR(200)
    AS
    BEGIN
        DECLARE @Q VARCHAR(MAX)
        BEGIN TRY
        SET @Q = '    IF NOT EXISTS (SELECT * FROM OPENQUERY('+@SERVER_PATH+',''SELECT * FROM SYS.SYSDATABASES WHERE NAME = '''''+@DB+'''''''))    
                    BEGIN         
                        SELECT 0
                    END
                    ELSE 
                    BEGIN        
                        IF NOT EXISTS (SELECT * FROM OPENQUERY('+@SERVER_PATH+',''SELECT * FROM '+@DB+'.DBO.SYSOBJECTS WHERE NAME = '''''+@TABLE+''''' AND TYPE = ''''U''''''))
                            SELECT 0
                        ELSE
                            SELECT 1
                    END '
        EXEC (@Q)
        END TRY
        BEGIN CATCH
            SELECT 0
        END CATCH
    END

위 SP를 통해 아래와 같이 출력되는 값을 확인하여 분기 처리 가능합니다.

 

How to check linked server db instance or table existants check?
Make test sp and check trough that procedure.

관련문의사항은 연락주세요. 감사합니다. ​

링크드 서버가 아닌 해당 데이터베이스 내에서의 인스턴스 존재 유무, 테이블 존재 유무 확인은

DB인스턴스의 경우 SYS.SYSDATABASES 에서 조회

테이블의 경우 [DB].DBO.SYSOBJECTS / [DB].INFORMATION_SCHEMA.TABLES 에서 조회 하여 확인이 가능합니다.

 

EX)

IF EXISTS (SELECT * FROM SYS.SYSDATABASES WHERE NAME = 'TEST')
PRINT 'EXISTS'
ELSE
PRINT 'NOT EXISTS'

IF EXISTS (SELECT * FROM TEST.DBO.SYSOBJECTS WHERE NAME = 'TEST' AND TYPE ='U')
PRINT 'EXISTS'
ELSE
PRINT 'NOT EXISTS'

IF EXISTS (SELECT * FROM TEST.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TEST')
PRINT 'EXISTS'
ELSE
PRINT 'NOT EXISTS'


하지만 링크드서버(원격서버)의 DB인스턴스, 테이블 존재 유무 판단을 하기위해서는 다른 방법을 사용해야합니다.
특히 인스턴스가 없는경우에는 쿼리로 확인이 안됩니다.
이때는 확인을 위한 별도 SP를 생성하고 해당 SP내에서 TRY CATCH를 통해 판단이 가능합니다.

SP

ALTER PROC FN_DB_TBL_EXISTS
    @SERVER_PATH   VARCHAR(100),
    @DB  VARCHAR(200),
    @TABLE  VARCHAR(200)
    AS
    BEGIN
        DECLARE @Q VARCHAR(MAX)
        BEGIN TRY
        SET @Q = '    IF NOT EXISTS (SELECT * FROM OPENQUERY('+@SERVER_PATH+',''SELECT * FROM SYS.SYSDATABASES WHERE NAME = '''''+@DB+'''''''))    
                    BEGIN         
                        SELECT 0
                    END
                    ELSE 
                    BEGIN        
                        IF NOT EXISTS (SELECT * FROM OPENQUERY('+@SERVER_PATH+',''SELECT * FROM '+@DB+'.DBO.SYSOBJECTS WHERE NAME = '''''+@TABLE+''''' AND TYPE = ''''U''''''))
                            SELECT 0
                        ELSE
                            SELECT 1
                    END '
        EXEC (@Q)
        END TRY
        BEGIN CATCH
            SELECT 0
        END CATCH
    END

위 SP를 통해 아래와 같이 출력되는 값을 확인하여 분기 처리 가능합니다.

 

How to check linked server db instance or table existants check?
Make test sp and check trough that procedure.

댓글