SQL Server 2008 - различные порядки сортировки по значениям VARCHAR и NVARCHAR - PullRequest
2 голосов
/ 09 июля 2010

В SQL Server 2008 наблюдается странное поведение при упорядочении столбцов NVARCHAR; Вот несколько примеров быстрого использования для демонстрации:

Случай 1: ЗАКАЗАТЬ на значения VARCHAR:

SELECT t.Name
FROM
( 
SELECT CAST('A' AS VARCHAR(500))  As Name
UNION SELECT CAST('-A' AS VARCHAR(500))  AS NAME
) As t
ORDER BY t.Name ASC

Который производит (мой желаемый) результат:

-A
A

(тот, у которого начинается тире, отображается первым)

Сравните это с ORDER на значениях NVARCHAR:

SELECT t.Name
FROM
( 
SELECT CAST('A' AS NVARCHAR(500))  As Name
UNION SELECT CAST('-A' AS NVARCHAR(500))  AS NAME
) As t
ORDER BY t.Name ASC

Который производит этот вывод:

A
-

Предполагается, что я хочу отсортировать по полям NVARCHAR (я не могу изменить дизайн БД), используя стандартное предложение ORDER BY (я использую linq2nhib, что не позволяет мне выполнять какое-либо приведение здесь) - как мне получить сортировку работать желаемым образом (элемент с первым не буквенно-цифровым значением отображается первым)?

Я надеюсь, что для этого есть какая-то настройка сопоставления на уровне базы данных / сервера ... есть идеи?

Ответы [ 3 ]

1 голос
/ 20 апреля 2012

Вам нужно использовать двоичное сопоставление для достижения последовательного упорядочения.

ORDER BY t.Name ASC COLLATE Latin1_General_BIN

Редактировать: Поскольку вы не можете выполнить сопоставление в запросе, вам нужно будет сделать это вуровень базы данных.

Вам нужно будет установить его для сравниваемых столбцов, и он должен быть двоичным.

Вот пример этого.

1 голос
/ 24 марта 2011

Либо измените параметры сортировки в базе данных, либо измените параметры сортировки отдельных столбцов в таблицах, для которых необходимо согласованное упорядочение.

Параметры сортировки Latin1_General_BIN or Latin1_General_BIN2 отлично работают с вашим примером.

0 голосов
/ 17 июля 2013

Вы также можете заказать набор с CAST (VARCHAR) на CTE, который возвращает первичный ключ и выполняет соединение таблицы, чтобы получить значение NVARCHAR.

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