TSQL Использование soundex на связанных серверах - PullRequest
1 голос
/ 20 июня 2019

(имена объектов в этом сообщении были изменены, чтобы защитить идиоцента).

Я сопоставлял списки имен сотрудников, где один список был на сервере_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» на другом.Arrgh!Итак, этот (пример) запрос возвращает строки, в которых я не ожидал:

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
; 

Мой вопрос таков: Эта проблема вызвана процессом, который выбирает лучший план, предполагая, что функционирует как SOUNDEX () в разных версиях SQL Server все согласованно?Кажется, что он просто отправляет запрос без изменений обратно на удаленный сервер, который применяет свою версию SOUNDEX ().Это, кажется, не гарантировано, чтобы соответствовать. Дополнительный вопрос: Может ли это обоснование быть экстраполировано на все функции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...