如何使用OPENQUERY将本地SQL Server的GEOMETRY数据插入带连字符的链接服务器
解决带连字符的远程数据库OPENQUERY INSERT语法错误问题
我之前碰到过一模一样的情况——远程数据库名带连字符时,OPENQUERY跑SELECT没问题,一用INSERT就报语法错。这是因为两种操作的语句解析逻辑有差异,SELECT场景下方括号的解析比较直接,但INSERT时对特殊字符对象名的解析规则更严格。这里给你两个可行的解决方案:
方案1:改用EXECUTE ... AT 语法(推荐)
这种方式会直接在链接服务器上执行完整的INSERT语句,能彻底绕开本地对OPENQUERY的解析问题,更可靠地处理带特殊字符的对象名。示例代码如下:
-- 定义要在远程服务器执行的SQL,注意字符串里的单引号要转义(用两个单引号表示一个) DECLARE @remoteSql NVARCHAR(MAX) = N' INSERT INTO [their-db-name].[theirSchema].[Dimensions] ([geometry]) SELECT [geometry] FROM OPENQUERY([LOCAL_SERVER], ''SELECT [geometry] FROM [my_db].[dbo].[Dimensions]'') '; -- 在链接服务器上执行这条SQL EXECUTE (@remoteSql) AT [LINKED SERVER];
记得把[LOCAL_SERVER]换成你的本地SQL Server实例名(本地实例也可以用(local)),[LINKED SERVER]替换成你的链接服务器名称。
方案2:调整OPENQUERY内的标识符引号
如果坚持要用OPENQUERY,可以试试在远程语句里用双引号包裹带连字符的数据库名(前提是远程服务器的QUOTED_IDENTIFIER设置为ON,这是SQL Server的默认配置):
INSERT OPENQUERY([LINKED SERVER], 'SELECT [geometry] FROM "their-db-name"."theirSchema"."Dimensions"') SELECT [geometry] FROM [my_db].[dbo].[Dimensions];
通过双引号明确标识对象名,能让远程服务器正确解析带连字符的数据库名称。
为什么SELECT正常但INSERT报错?
SELECT场景下,OPENQUERY只需要解析查询语句并返回结果,方括号的解析逻辑比较宽松;但INSERT时,SQL Server会把OPENQUERY内的SELECT语句视为目标表的引用,此时对特殊字符对象名的解析规则更严格,就容易触发语法错误。改用EXECUTE ... AT相当于直接在远程端跑完整语句,自然规避了本地解析的差异。
内容的提问来源于stack exchange,提问作者phoal
相关产品推荐
相关产品推荐

