促进 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
我正在使用链接服务器,发现编写这样的查询非常痛苦:
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