2016-11-02 3 views
1

동의어와 연결된 서버에 대한 속기 참조를 촉진하고 매우 고통스러운이 같은 쿼리를 작성하기 위해 찾는 :내가 연결된 서버를 사용하고

select * from [10.150.10.109].lhf.[dbo].[TABLE_NAME] 

는이 같은 동의어를 사용할 수있다 :

CREATE SYNONYM [DataRelay] FOR [10.150.10.109].[lhf].[dbo] 

이런 식으로 쿼리 할 수 ​​있도록하기 위해 :

select * from DataRelay.TABLE_NAME 

Without the capabilities of Intellisense, 이것은 단지 고통 스럽습니다. ...

+2

연결된 서버에 더 좋은 이름을 지정하십시오. LinkedServer 이름은 실제 서버 이름과 일치하지 않습니다. – RBarryYoung

+0

아니 겠지만 링크 된 서버에서 데이터베이스의 개체에 대한 동의어 만들기를 쉽게 스크립팅 할 수 있습니다. [servername]. [dbname] .sys.objects와 동적 SQL을 사용하십시오. – Matt

+0

@Matt, 당신이 의미 한 바를 명확히 해 주시겠습니까? – Eliezer

답변

0

당신이 원하는대로 당신이 개체 경로의 한 부분에 대한 동의어를 생성 할 수 있다는 것입니다. 그러나 원격 데이터베이스의 모든 객체에 대한 동의어 삭제 및 생성을 동적으로 스크립팅 할 수 있습니다. 다음은 사용자 테이블의 경우 수행하는 방법의 예입니다. 다른 개체의 경우 sys.table 시스템보기 대신 sys.objects를 사용할 수 있습니다.

더 많은 학습을위한 핵심어입니다. 동적 SQL, 커서, 스키마 뷰.

DECLARE @ServerAndDB SYSNAME = '[10.150.10.109].[lhf]' 
DECLARE @SynonymSchema SYSNAME = '[syn]' 

DECLARE @ObjectPath NVARCHAR(1000) 
DECLARE @SynonymName NVARCHAR(1000) 

DECLARE CursorName CURSOR FOR 
    SELECT 
     @ServerAndDB + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) as ObjectPath 
     ,@SynonymSchema + '.' + QUOTENAME(t.name) as SynonymName 
    FROM 
     [10.150.10.109].[lhf].sys.tables t 
    WHERE 
     t.type = 'U' 

OPEN CursorName 

FETCH NEXT FROM CursorName 
INTO @ObjectPath, @SynonymName 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     BEGIN TRY 

      DECLARE @SQL NVARCHAR(MAX) 

      IF EXISTS (SELECT * FROM sys.synonyms WHERE object_id = OBJECT_ID(@SynonymName)) 
      BEGIN 
      SET @SQL = 'DROP SYNONYM ' + @SynonymName 
      EXECUTE sp_executesql @SQLString 
      SET @SQL = '' 
      END 

      SET @SQL = 'CREATE SYNONYM ' + @SynonymName + ' FOR ' + @ObjectPath 
      EXECUTE sp_executesql @SQLString 
      SET @SQL = '' 

     END TRY 
     BEGIN CATCH 
      --Can do error handling here 
     END CATCH 

     FETCH NEXT FROM CursorName 
     INTO @ObjectPath, @SynonymName 
    END 

CLOSE CursorName 
DEALLOCATE CursorName 
1

아니요, 연결된 서버에는 아무런 손해가 없습니다. 그러나 쿼리에서 테이블을 별칭으로 쉽게 지정할 수 있습니다. 나는 내 댓글에 한 말 분을 한 것으로 지금

select * from [10.150.10.109].lhf.[dbo].[TABLE_NAME] T 
WHERE 
    T.FieldName=1 
    OR 
    T.FieldName=2