为何SELECT可用四前缀访问链接服务器,ALTER却报错?
问题原因与解决办法
为什么SELECT能用四前缀但ALTER不行?
SQL Server对数据操作语言(DML,比如SELECT、INSERT这类)和数据定义语言(DDL,比如ALTER、CREATE这类)的跨服务器对象访问规则不一样:
- SELECT这类DML语句支持
[链接服务器].[数据库].[架构].[表]这种四部分命名格式,因为分布式查询引擎会自动把查询请求转发到目标链接服务器去执行,相当于后台帮你做了跨服务器的请求转发。 - 但ALTER TABLE属于DDL操作,SQL Server的语法规则不允许直接用四部分命名来执行跨服务器的DDL,它要求DDL命令必须显式发送到目标服务器执行,所以直接用四前缀就会触发“前缀数量超过最大值2”的语法错误。
怎么解决这个问题?
要修改链接服务器上的表结构,你可以用EXEC AT语句把ALTER命令直接发到目标链接服务器执行,代码示例:
EXEC ('ALTER TABLE [import].[dbo].[table] ADD field nvarchar(4000)') AT [EC2AMAZ\SQLEXPRESS];
另外也可以用OPENQUERY来执行:
SELECT * FROM OPENQUERY([EC2AMAZ\SQLEXPRESS], 'ALTER TABLE [import].[dbo].[table] ADD field nvarchar(4000)');
简单来说,DDL操作必须在目标服务器的上下文里运行,而DML的四前缀是本地服务器帮你转发了请求,DDL不支持这种隐式转发,得显式指定在目标服务器上执行命令。
内容的提问来源于stack exchange,提问作者user713813
相关产品推荐
相关产品推荐

