coalesce преобразует не-Unicode символы в вопросительные знаки - PullRequest
0 голосов
/ 21 декабря 2018

Перенос приложения из SQL Server 2012 в SQL Server 2017.

Я выполняю следующие 2 запроса на импорт данных (Name - это varchar столбец, содержащий неанглийские буквы).

select Name from RemoteServer.RemoteDB.dbo.RemoteView
select coalesce(Name,'') from RemoteServer.RemoteDB.dbo.RemoteView

На SQL 2012 результаты идентичны.В SQL 2017 я вижу следующее:

1

В чем может быть причина?

К сожалению, я не могу изменить типы данных на удаленном сервере на nvarchar.

ОБНОВЛЕНИЕ : дополнительная информация.

Свойства связанного сервера одинаковы (сценарий связанного сервера на SQL 2012 и его создание на SQL 2017 с использованием этого сценария).

На обоих серверах (по историческим причинам) сопоставление серверов (и сопоставление системных баз данных) равно Cyrillic_General_CI_AS, мое сопоставление баз данных равно SQL_Latin1_General_CP1251_CI_AS.

На удаленном сервере сопоставления как серверов, так и баз данныхCyrillic_General_CI_AS.

В SQL 2012 оба запроса показывают данные в контексте любой базы данных.

В SQL 2017 он хорошо работает в системных базах данных и, как показано выше, в моей базе данных.Таким образом, это зависит от параметров сортировки базы данных.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Нет настроек для тестирования, но вы можете попробовать:

select coalesce(Name collate Cyrillic_General_CI_AS,'')
from RemoteServer.RemoteDB.dbo.RemoteView;
0 голосов
/ 21 декабря 2018

Проблема не в функции coalesce, которая в основном возвращает только первое ненулевое значение, проблема в типе данных varchar вместо nvarchar, но даже если вы используете nvarchar, вы должны использовать N'Languageword ', здесь примердля доказательства вас.

DECLARE @Table AS TABLE
(
   RussianCol VARCHAR(100)
)

INSERT INTO @Table ( RussianCol )
VALUES ( 'спасбо' -- RussianCol - varchar(100)
       ),('Помогите')

SELECT * FROM @Table
...