SQL Server Management Studio生成链接服务器表SELECT脚本时列重复
问题原因说明
这是SQL Server Management Studio (SSMS) v18.x全版本(包含你使用的18.8)的已知公开Bug,触发场景为针对链接服务器对象生成SELECT类脚本时,SSMS会重复读取元数据多次,导致列名被重复插入到生成的语句中,重复次数和链接服务器的数据源类型、本地元数据缓存状态有关。
修复方案
- 根本修复:直接升级到SSMS 19.x及以上版本,微软已经在SSMS 19的首个正式版中修复了该Bug,升级后所有链接服务器脚本生成逻辑都会恢复正常。
临时替代方案(无法升级版本时使用)
- 拖拽列生成语句
打开对象资源管理器,找到对应链接服务器下的目标表,展开表的「列」节点,直接将列文件夹拖拽到查询编辑器窗口,SSMS会自动插入所有无重复的列名,直接补充SELECT前缀和表名即可使用。 - 用系统视图自动生成脚本
执行以下查询直接生成去重的SELECT语句,替换对应参数即可:
-- 替换语句中的链接服务器名、目标数据库名、Schema名、表名即可 DECLARE @linked_server NVARCHAR(128) = 'MyLinkedObject' DECLARE @db_name NVARCHAR(128) = '你的数据库名' DECLARE @schema_name NVARCHAR(128) = 'dbo' DECLARE @table_name NVARCHAR(128) = 'UNIT_LOC' DECLARE @sql NVARCHAR(MAX) SET @sql = 'SELECT ''SELECT '' + STRING_AGG(''['' + name + '']'', '', '') + '' FROM ' + QUOTENAME(@linked_server) + '.' + QUOTENAME(@db_name) + '.' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@table_name) + ''' FROM ' + QUOTENAME(@linked_server) + '.' + QUOTENAME(@db_name) + '.sys.columns WHERE object_id = OBJECT_ID(''' + QUOTENAME(@linked_server) + '.' + QUOTENAME(@db_name) + '.' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@table_name) + ''')' EXEC sp_executesql @sql
- 刷新元数据临时解决
右键点击对应链接服务器,选择「刷新」清空本地缓存的元数据,再重新生成脚本,部分场景下可临时解决重复问题,但不保证长期生效。
内容的提问来源于stack exchange,提问作者Koughdur
相关产品推荐
相关产品推荐

