Цитата:
Сообщение от
Perc
collation на сервере на БД и на таблице - Cyrillic_General_CI_AS.
Как правильно смотреть коды символов на сервере БД не знаю
Создаешь простую тестовую таблицу, наполняешь ее ASCII-кодами и сортируешь. Смотришь результат
PHP код:
if object_id('tempdb..#test') is not null drop table #test
-- Можно явно задавать Collation для символьных полей
-- если явно не указан, то берется из настроек базы данных
create table #test (f1 int null, f2 varchar(1))
--create table #test (f1 int null, f2 varchar(1) COLLATE Cyrillic_General_CI_AS)
--create table #test (f1 int null, f2 varchar(1) COLLATE SQL_Latin1_General_CP1251_CI_AS)
declare @next int, @total int
set @total = 255
set @next = 0
-- Пустая строка
insert into #test values (null, '')
while (@next <= @total)
begin
insert into #test values (@next, char(@next))
set @next = @next + 1
end
select * from #test order by f2
Аналогично делаешь подобную временную таблицу в Axapta и смотришь, как оличается сортировка в Axapta от сортировки в MS SQL
Если сравниваемые символы - это не буквы и не цифры, то результат заранее предсказать сложно.
Если есть возможность, то лучше синхронизировать коды не сравнивая по принципу "больше/меньше", а сравнивая по принципу "не равно".
Например, у нас Ax2.5SP3 и MS SQL 2005 Collation SQL_Latin1_General_CP1251_CI_AS. При такой сортировке, символ дефиса (тире) оказывается меньше любого другого символа. Даже меньше пустой строки (!)
Поэтому, если в Axapta написать запрос вида
X++:
select MyTab where MyTab.MyField
то на сервер уйдет запрос вида
X++:
select * from MyTab where MyTab.MyField > ''
но, поскольку дефис меньше (!) пустой строки, то если содержимое поля MyField начинается именно с дефиса, то эта запись не попадет в выборку (!)
А вот если написать
X++:
select MyTab where MyTab.MyField != ""
то на сервер уйдет запрос вида
X++:
select * from MyTab where MyTab.MyField <> ''
что корректно отработает с символом дефиса, поскольку он действительно отличен от пустой строки.
Другой вариант - это делать выборку на сервере, а потом перегонять ее во временную таблицу на клиенте для корректной сортировки.