SQL Server中执行带REPLACE的OPENQUERY报错:需引号标识符
解决SQL Server 2008 R2中OPENQUERY嵌套查询的引号标识符错误
你遇到的问题主要来自嵌套SQL的引号转义错误、语法结构混乱,还有一个容易踩坑的点——SQL Server的REPLACE函数并不支持正则表达式,我一步步帮你梳理解决:
第一步:修正基础语法与引号转义
你的原查询有两个明显的语法问题:
- 字段别名
[CUSTOMER_MFG_VENDOR_NAME]后未加逗号,直接跟createdby,导致SQL解析失败; - OPENQUERY内部的嵌套字符串中,单引号需要用两个单引号转义,否则会被SQL Server误判为字符串结束符。
先给你一个修正了引号和语法的基础版本:
SELECT * FROM OPENQUERY(XREF_PROD, ' SELECT resourcecalenderid, racfid, leavetype, leavestartdate, leaveenddate, -- 内部单引号全部转义为两个,字段间添加逗号分隔 REPLACE(modifiedby, ''^0-9a-zA-Z -'', '''') AS [CUSTOMER_MFG_VENDOR_NAME], createdby, createdon, modifiedby, modifiedon FROM XREF.XREF_RESOURCE_CALENDER ')
第二步:解决正则替换的问题
这里要提醒你:SQL Server的REPLACE函数只能替换固定字符串,无法识别正则表达式。上面的写法只是把字符串^0-9a-zA-Z -从modifiedby字段中替换掉,完全达不到你想要的“过滤非字母数字/空格/短横线字符”的效果。
如果你的需求是移除modifiedby中所有不符合0-9a-zA-Z -规则的字符,推荐用自定义函数实现:
1. 创建自定义清理函数
在你的SQL Server上执行以下脚本创建函数:
CREATE FUNCTION dbo.CleanNonAllowedChars(@input VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS BEGIN -- 循环移除所有匹配到的非法字符 WHILE PATINDEX('%[^0-9a-zA-Z -]%', @input) > 0 BEGIN SET @input = STUFF(@input, PATINDEX('%[^0-9a-zA-Z -]%', @input), 1, '') END RETURN @input END
2. 修改查询,用函数处理数据
为避免链接服务器上的函数兼容性问题,我们先通过OPENQUERY拉取原始数据,再用本地函数处理:
SELECT resourcecalenderid, racfid, leavetype, leavestartdate, leaveenddate, dbo.CleanNonAllowedChars(modifiedby) AS [CUSTOMER_MFG_VENDOR_NAME], createdby, createdon, modifiedby, modifiedon FROM OPENQUERY(XREF_PROD, ' SELECT resourcecalenderid, racfid, leavetype, leavestartdate, leaveenddate, modifiedby, createdby, createdon, modifiedby, modifiedon FROM XREF.XREF_RESOURCE_CALENDER ')
最后验证
执行上面的查询应该就能解决引号错误和正则替换的问题了。如果还有链接服务器权限问题,记得确认你的账号有权限访问XREF_PROD链接服务器和XREF.XREF_RESOURCE_CALENDER表。
内容的提问来源于stack exchange,提问作者David Powell
相关产品推荐
相关产品推荐

