利用同义词促进链接服务器的速记引用

时间:2016-11-02 19:18:21

标签: sql-server intellisense linked-server sql-server-2016

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

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 个答案:

答案 0 :(得分:1)

不,链接服务器没有简写,但是,您可以在查询中对表进行别名,以使其更容易。

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

答案 1 :(得分:0)

现在我有一分钟在评论中说的是你无法根据需要为对象路径的一部分创建同义词。但是,您可以非常轻松地为远程数据库中的任何对象动态编写代码的删除和创建。这是一个如何为用户表执行操作的示例。对于其他对象,您可以使用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