TSQL 跨链接服务器使用 soundex
TSQL Using soundex across linked servers
(此 post 中的对象名称已更改以保护白痴)。
我正在匹配员工姓名列表,其中一个列表在 Server_A
- 列collation:Latin1_General_CI_AS
- 列数据类型:VARCHAR(50)
- 列可空性 NULL
- SQL 服务器版本 12.0.4100.1
- 兼容性:120
...另一个列表在 Server_B
- 列collation:Latin1_General_CI_AS
- 列数据类型:VARCHAR(30)
- 列可空性 NOT NULL
- SQL 服务器版本 10.50.4000.0
- 兼容性:100
在某些情况下,相同的值会返回不同的 SOUNDEX 值。如此有效地说,在确实存在匹配的地方不存在匹配。在这些情况下,通常(但不总是)存在一定程度的名称复杂性。所以 print soundex('Czosgro')
(不是真名)returns 'C226' 在一台服务器上,'C260' 在另一台服务器上。啊!所以这个(示例)查询 returns 行我没想到它:
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 中的数据选择到本地服务器上的临时文件 table 来解决问题。 运行以下说明问题不再明显:
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
;
我的问题是: 这个问题是否是由决定最佳计划的过程引起的,假设 SOUNDEX() 跨不同版本的 SQL服务器都一致?似乎它只是将查询原封不动地推送回远程服务器,远程服务器应用它的 SOUNDEX() 版本。这似乎不能保证匹配。 补充问题:这个推理可以外推到所有函数吗?
确实 SOUNDEX()
在不同版本的 SQL 服务器上对于一小群 "sounds"(例如 "cz" 声音)的表现确实不同。我上面描述的解决方案似乎可行。用户应注意,在每个实例上使用 SOUNDEX()
函数进行的跨服务器比较可能不会产生一致的结果。
(此 post 中的对象名称已更改以保护白痴)。
我正在匹配员工姓名列表,其中一个列表在 Server_A
- 列collation:Latin1_General_CI_AS
- 列数据类型:VARCHAR(50)
- 列可空性 NULL
- SQL 服务器版本 12.0.4100.1
- 兼容性:120
...另一个列表在 Server_B
- 列collation:Latin1_General_CI_AS
- 列数据类型:VARCHAR(30)
- 列可空性 NOT NULL
- SQL 服务器版本 10.50.4000.0
- 兼容性:100
在某些情况下,相同的值会返回不同的 SOUNDEX 值。如此有效地说,在确实存在匹配的地方不存在匹配。在这些情况下,通常(但不总是)存在一定程度的名称复杂性。所以 print soundex('Czosgro')
(不是真名)returns 'C226' 在一台服务器上,'C260' 在另一台服务器上。啊!所以这个(示例)查询 returns 行我没想到它:
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 中的数据选择到本地服务器上的临时文件 table 来解决问题。 运行以下说明问题不再明显:
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
;
我的问题是: 这个问题是否是由决定最佳计划的过程引起的,假设 SOUNDEX() 跨不同版本的 SQL服务器都一致?似乎它只是将查询原封不动地推送回远程服务器,远程服务器应用它的 SOUNDEX() 版本。这似乎不能保证匹配。 补充问题:这个推理可以外推到所有函数吗?
确实 SOUNDEX()
在不同版本的 SQL 服务器上对于一小群 "sounds"(例如 "cz" 声音)的表现确实不同。我上面描述的解决方案似乎可行。用户应注意,在每个实例上使用 SOUNDEX()
函数进行的跨服务器比较可能不会产生一致的结果。