2016-11-02 2 views
1

ich einen Verbindungsserver verwenden und es sehr schmerzhaft zu finden, Abfragen wie folgt zu schreiben:Erleichterung Stenografie Referenzierung für den Verbindungsserver mit Synonymen

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

Ist es möglich, ein Synonym für etwas zu verwenden:

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

, um so Abfrage zu:

select * from DataRelay.TABLE_NAME 

Without the capabilities of Intellisense, das ist nur schmerzhaft ...

+2

Machen Sie einfach bessere Namen für Ihre verbundenen Server. Der Name des LinkedServer muss * nicht * mit dem tatsächlichen Servernamen übereinstimmen. – RBarryYoung

+0

Nein, aber Sie können die Erstellung von Synonymen für Objekte in Ihrer Datenbank auf Ihrem Verbindungsserver leicht skripten. benutze einfach [servername]. [dbname] .sys.objects und dynamische sql dazu – Matt

+0

@Matt, kannst du bitte klarstellen, was du meinst? – Eliezer

Antwort

0

Nun, da ich eine Minute hatte, was ich in meinem Kommentar sagte, ist, dass Sie nur einen Teil eines Objekts Pfad ein Synonym nicht schaffen können, wie Sie es wünschen. Aber Sie können das Löschen und Erstellen von Synonymen für jedes Objekt in Ihrer entfernten Datenbank sehr einfach skripten. Hier finden Sie ein Beispiel für die Vorgehensweise für Benutzertabellen. Für andere Objekte können Sie die sys.objects anstelle der Systemsicht sys.table verwenden.

Technik Schlüsselwörter für mehr lernen. Dynamisches SQL, Cursor, Schemaansichten.

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

Nein, es gibt keine kurze Hand für verbundene Server, jedoch können Sie Tabellen in Ihren Abfragen Alias-Aliase, um es ein bisschen einfacher zu machen.

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