SQL Server 2016 + присоединение к связанному серверу = строка не возвращена - PullRequest
0 голосов
/ 22 октября 2018

Я запрашиваю на SQL Server 2016:

SELECT 1
FROM LINKEDSERVER1.DATABASE1.DBO.TABLE1 A with (nolock)
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE2 B with (nolock) ON ...
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE3 C with (nolock) ON ...
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE4 D with (nolock) ON (D.FIELD1 = C.FIELD1 AND D.CHAR_FIELD2 = B.VARCHAR_FIELD2 AND (D.FIELD3 = B.FIELD3 OR D.FIELD3 = B.FIELD4))
WHERE B.FIELD5 IN ('4472')

Результат: строка не возвращается

1 - если я изменяю условие ИD.CHAR_FIELD2 = B.VARCHAR_FIELD2 вне объединения:

SELECT 1
FROM LINKEDSERVER1.DATABASE1.DBO.TABLE1 A with (nolock)
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE2 B with (nolock) ON ...
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE3 C with (nolock) ON ...
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE4 D with (nolock) ON (D.FIELD1 = C.FIELD1 AND (D.FIELD3 = B.FIELD3 OR D.FIELD3 = B.FIELD4))
WHERE B.FIELD5 IN ('4472')
AND D.CHAR_FIELD2 = B.VARCHAR_FIELD2

Результат: строка возвращается

2 - если я удалю связанный сервер на TABLE4 :

SELECT 1
FROM LINKEDSERVER1.DATABASE1.DBO.TABLE1 A with (nolock)
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE2 B with (nolock) ON ...
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE3 C with (nolock) ON ...
LEFT JOIN TABLE4 D with (nolock) ON (D.FIELD1 = C.FIELD1 AND D.CHAR_FIELD2 = B.VARCHAR_FIELD2 AND (D.FIELD3 = B.FIELD3 OR D.FIELD3 = B.FIELD4))
WHERE B.FIELD5 IN ('4472')

Результат: строка возвращается

3 - если я выполняю тот же запрос на SQL Server 2005:

SELECT 1
FROM LINKEDSERVER1.DATABASE1.DBO.TABLE1 A with (nolock)
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE2 B with (nolock) ON ...
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE3 C with (nolock) ON ...
LEFT JOIN LINKEDSERVER1.DATABASE1.DBO.TABLE4 D with (nolock) ON (D.FIELD1 = C.FIELD1 AND D.CHAR_FIELD2 = B.VARCHAR_FIELD2 AND (D.FIELD3 = B.FIELD3 OR D.FIELD3 = B.FIELD4))
WHERE B.FIELD5 IN ('4472')

Результат: строка возвращается

Я использую SQL Server 2016 13.0.1601.5.Я не смог найти ничего об этом на SP1 и SP2.

Это известная проблема?Я что-то упустил?

1 Ответ

0 голосов
/ 23 октября 2018

Нашел проблему.Я проверял параметры сортировки полей, но параметры сортировки баз данных по умолчанию разные.

Я полагаю, что поскольку поля имеют тип char и varchar, то выполняется приведение одного из них с использованием параметров сортировки по умолчанию, а затем, когда выполняется удаленный запрос, он не находит запись.

Если я изменяю параметры сортировки по умолчанию или параметры поля силы, это работает.Если я отключу «Использовать удаленную сортировку» в свойствах связанного сервера, это тоже будет работать.

...