Сравнение VARCHAR и упорядочение VARBINARY в SQL Server 2000 - PullRequest
0 голосов
/ 07 мая 2009

Мне необходимо выполнить слияние в памяти в C # двух отсортированных потоков строк, поступающих из одной или нескольких баз данных SQL Server 2000 в один отсортированный поток. Эти потоки данных могут быть огромными, поэтому я не хочу вытягивать оба потока в память. Вместо этого мне нужно хранить по одному элементу за раз из каждого потока в памяти и на каждом шаге сравнивать текущий элемент из каждого потока, помещать минимум в конечный поток и извлекать следующий элемент из соответствующего исходного потока. Тем не менее, чтобы сделать это правильно, сравнение в памяти должно соответствовать сопоставлению базы данных (рассмотрим потоки [A,B,C] и [A,B,C]: правильная объединенная последовательность равна [A,A,B,B,C,C], но если ваше сравнение в памяти считает C < B, ваше слияние в памяти выдаст A,A,B, после чего оно будет смотреть на B и C, и выдаст C, что приведет к неправильно отсортированному потоку.)

Итак, мой вопрос: есть ли способ имитировать какие-либо параметры сортировки в SQL Server 2000 с перечислением System.StringComparison в C # или наоборот? Самое близкое, что я пришел, - это использование System.StringCompaison.Ordinal с результатами строк базы данных, преобразованными в VARBINARY со стандартным порядком VARBINARY, который работает, но я бы просто добавил предложение "order by name collate X" в мой SQL запросов, где X - это некоторое сопоставление, которое работает точно так же, как и порядок VARBINARY, вместо преобразования всех строк в VARBINARY, когда они покидают базу данных, а затем обратно в строки, когда они поступают в память.

Ответы [ 2 ]

0 голосов
/ 07 мая 2009

С sql 2005 я знаю, что ядро ​​db не выполняет вызовы ОС для выполнения сортировки, правила упорядочивания статически поставляются с db (может обновляться с пакетом обновления, но не изменяется с ОС) Поэтому я не думаю, что вы можете с уверенностью сказать, что данный набор кода приложения можно упорядочить таким же образом, если у вас нет того же кода, что и у сервера db, если вы не используете двоичное сопоставление.

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

РЕДАКТИРОВАТЬ - любая сортировка, оканчивающаяся на _BIN, даст вам двоичную сортировку. Остальная часть имени сопоставления будет определять, какая кодовая страница используется для хранения данных CHAR, но не влияет на порядок. _BIN означает строго двоичную сортировку. Смотри http://msdn.microsoft.com/en-us/library/ms143515(SQL.90).aspx

0 голосов
/ 07 мая 2009

Посмотрите на класс StringComparer. Это обеспечивает более надежное сравнение символов и строк по сравнению с String.Compare. Существует три набора статических экземпляров (CurrentCulture, InvariantCulture, Ordinal) и версии без учета регистра. Для более специализированных культур вы можете использовать функцию StringComparer.Create() для создания сравнения с определенной культурой.

...