促进 shorthand 引用具有同义词的链接服务器

Facilitating shorthand referencing for linked server with synonyms

我正在使用链接服务器,发现编写这样的查询非常痛苦:

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,这简直是痛苦...

不,没有链接服务器的简写,但是,您可以在查询中为表添加别名以使其更容易一些。

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

现在我有一点时间,我在评论中所说的是,您不能根据需要为对象路径的一部分创建同义词。但是您可以非常轻松地为远程数据库中的任何对象动态编写删除和创建同义词的脚本。这是一个如何为用户表做的例子。对于其他对象,您可以使用 sys.objects 而不是 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