TSQL在链接的服务器之间使用soundex

时间:2019-06-20 04:01:12

标签: sql-server tsql linked-server soundex

(本文中的对象名称已更改,以保护惯用语言。)

我正在匹配员工姓名列表,其中一个列表在Server_A上

  • 列排序规则:Latin1_General_CI_AS
  • 列数据类型:VARCHAR(50)
  • 列可为空NULL
  • SQL Server版本12.0.4100.1
  • 兼容性:120

...而另一个列表在Server_B上

  • 列排序规则:Latin1_General_CI_AS
  • 列数据类型:VARCHAR(30)
  • 列可空性NOT NULL
  • SQL Server版本10.50.4000.0
  • 兼容性:100

在某些情况下,相同的值将返回不同的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()版本。看来,这不能保证匹配。 补充问题:能否将此推理推断到所有功能?

1 个答案:

答案 0 :(得分:0)

在不同版本的SQL Server上,SOUNDEX()确实对于一小组“声音”(例如“ cz”声音)的行为有所不同。我上面描述的解决方案似乎可行。用户应注意,在每个实例上使用SOUNDEX()函数进行跨服务器比较可能不会获得一致的结果。