(本文中的对象名称已更改,以保护惯用语言。)
我正在匹配员工姓名列表,其中一个列表在Server_A上
...而另一个列表在Server_B上
在某些情况下,相同的值将返回不同的SOUNDEX值。因此有效地说在确实存在匹配的地方不存在匹配。在这些情况下,通常(但不总是)名称的复杂程度。因此,print soundex('Czosgro')
(不是真实名称)在一台服务器上返回“ C226”,而在另一台服务器上返回“ C260”。啊!因此,此(示例)查询返回的行不是我不期望的:
WITH srv2 as
(
SELECT DISTINCT psn.surname
,soundex(psn.surname) as sx
FROM blah.personnel psn --synonym to linked server table
)
, srv1 as
(
SELECT DISTINCT wrk.Surname
,soundex(wrk.Surname) as sx
FROM hr.Workers wrk
)
SELECT *
FROM srv2
JOIN srv1 ON rap.surname = srv1.Surname --Same name
WHERE srv2.sx <> srv1.sx --Different soundex
;
我能够通过将srv2中的数据选择到本地服务器上的临时表中来解决此问题。运行以下命令表明问题不再明显:
IF OBJECT_ID('tempdb..#srv2') IS NOT NULL DROP TABLE #srv2;
SELECT DISTINCT psn.surname
INTO #srv2
FROM blah.personnel psn --synonym to linked server table
;
WITH srv2 as
(
SELECT DISTINCT psn.surname
,soundex(psn.surname) as sx
FROM #srv2 psn
)
, srv1 as
(
SELECT DISTINCT wrk.Surname
,soundex(wrk.Surname) as sx
FROM hr.Workers wrk
)
SELECT *
FROM srv2
JOIN srv1 ON srv2.surname = srv1.Surname
WHERE srv2.sx <> srv1.sx
;
我的问题是:这个问题是由决定最佳计划的过程引起的,该过程假设跨SQL Server不同版本的SOUNDEX()之类的函数都一致吗?似乎只是简单地将查询保持不变,然后将其推回远程服务器,该远程服务器将应用它的SOUNDEX()版本。看来,这不能保证匹配。 补充问题:能否将此推理推断到所有功能?
答案 0 :(得分:0)
在不同版本的SQL Server上,SOUNDEX()
确实对于一小组“声音”(例如“ cz”声音)的行为有所不同。我上面描述的解决方案似乎可行。用户应注意,在每个实例上使用SOUNDEX()
函数进行跨服务器比较可能不会获得一致的结果。