2016-11-02 13 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とdynamic 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 
関連する問題