2016-11-02 2 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 does * not * должно соответствовать фактическому имени сервера. – RBarryYoung

+0

нет, но вы можете легко создать сценарий создания синонимов объектов в своей базе данных на вашем связанном сервере. просто используйте [имя_сервера]. [dbname] .sys.objects и dynamic sql для этого – Matt

+0

@Matt, не могли бы вы прояснить, что вы имели в виду? – Eliezer

ответ

0

Теперь, когда у меня была минута, что я говорил в своем комментарии, что вы не можете создать синоним только часть пути объекта, как вы хотите. Но вы можете легко с легкостью списать падение и создание синонимов для любого объекта в вашей удаленной базе данных. вот пример того, как это сделать, если для пользовательских таблиц. Для других объектов вы можете использовать sys.object вместо системного представления sys.table.

Техника ключевые слова для более обучения. Динамический 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 
Смежные вопросы