我使用链接服务器并发现写这样的查询非常痛苦:
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,这只是痛苦......
答案 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