Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 странности при сравнении строк  [new]
pavel_noob
Member

Откуда:
Сообщений: 1
Всем добрый день.

Я гружу данные в БД (MS SQL Server 2012) из файла xlsx через форму приложения на C# с помощью SQLBulkCopy. Грузится все в таблицу без проблем.

Часть полей - строки(nvarchar(max) - так как они могут быть любой длины). Там лежат наименования клиентов, магазинов и пр.

В БД есть несколько таблиц, содержащих классификаторы клиентов, магазинов и т.д.
В них наименования также представляют из себя поля типа nvarchar(max).

Коллэйт везде один и тот же - db_default ( Cyrillic_General_CI_AS )

При сравнении текстовых полей в таблице импорта с соответствующими полями в классификаторах происходит странное:

одинаковые, на первый взгляд, строки не проходят проверку ни с помощью оператора "=", ни с помощью оператора "LIKE".
При этом у обеих сравниваемых строковых переменных функция SOUNDEX возвращает одинаковые значения, а функция DIFFERENCE возвращает 4 - "полное или практически полное соответствие".

Например, создаем две переменные
declare @var1 nvarchar(max)
declare @var2 nvarchar(max)

Записываем в первую из них одно из строковых значений, занесенных в таблицу импорта при помощи SQLBulkCopy

set @var1 = (select top 1 client_naim from blk_copy_import ) - допустим, там лежит строка "Пятерочка".

Записываем во вторую переменную соотв. значение из таблицы-классификатора

set @var2 = (select naim_str from cls_client_tbl where prim_key = 15) - по той же Пятерочке.

Запрос

select
@var1,
@var2,
case when @var1 = @var2 then 1 else 0 end as check_equal,
case when @var1 like @var2 then 1 else 0 end as check_like,
difference(@var1, @var2) as check_difference_func

возвращает следующий набор результатов:

Пятерочка Пятерочка 0 0 4

То есть @var1 не равна @var2, не похожа на нее, но при этом они практически идентичны друг другу.

Подскажите пожалуйста - что происходит и как это лечится?

С уважением,
Павел.
20 июн 17, 18:49    [20578425]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36688
declare 
    @var1 nvarchar (max) = 'Пятерочка'

declare 
    @var2 nvarchar (max) = 'Пятерoчка'


select 
@var1, 
@var2,
case when @var1 = @var2 then 1 else 0 end as check_equal,
case when @var1 like @var2 then 1 else 0 end as check_like,
difference(@var1, @var2) as check_difference_func
, cast (@var1 as varbinary(20))
, cast (@var2 as varbinary(20))
20 июн 17, 18:55    [20578440]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
pavel_noob,

ну так, сконвертируйте их в varbinary и посмотрите, чем они на самом деле отличаются.
20 июн 17, 18:55    [20578447]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
нуб987
Guest
Гавриленко Сергей Алексеевич
+
declare 
    @var1 nvarchar (max) = 'Пятерочка'

declare 
    @var2 nvarchar (max) = 'Пятерoчка'


select 
@var1, 
@var2,
case when @var1 = @var2 then 1 else 0 end as check_equal,
case when @var1 like @var2 then 1 else 0 end as check_like,
difference(@var1, @var2) as check_difference_func
, cast (@var1 as varbinary(20))
, cast (@var2 as varbinary(20))

 П    я    т    е    р    о    ч    к    а
1F04 4F04 4204 3504 4004 3E04 4704 3A04 3004
1F04 4F04 4204 3504 4004 6F00 4704 3A04 3004
21 июн 17, 01:47    [20579121]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36688
нуб987,

Так-то я в курсе, ага.
21 июн 17, 01:49    [20579123]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
нуб987
Guest
Гавриленко Сергей Алексеевич
нуб987,

Так-то я в курсе, ага.

да это я не для тебя, а для таких же нубов :) ленивых
21 июн 17, 01:53    [20579124]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
ПаWWWлОдАрЕц
Member

Откуда: NSK-PVL
Сообщений: 135
pavel_noob,

Встречалось такое при импорте данных, наверняка у ТСа в импортируемых данных встречаются слова, в которых некоторые кириллические символы заменены латинскими. На глаз такое не заметишь, например: Андрей и дpeй, во втором слове жирные символы это латинские буквы.
В общем случае, я считал такие данные некорректными и вываливал в ошибки (благо бизнес логика позволяла так делать и скидывать все ошибки на владельцев исходных файлов)
21 июн 17, 05:30    [20579176]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7387
Если из экселя копипастят, то в строке может быть CRLF.
21 июн 17, 11:38    [20579950]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Minatavr
Member

Откуда: Чебоксары
Сообщений: 75
А еще из всяких вордов/экселей бывает, залетают незамеченными длинные пробелы, а также средние и длинные тире.
21 июн 17, 13:42    [20580509]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Alexander Us
Member

Откуда:
Сообщений: 1091
pavel_noob,

В файлах excel access итд. могут быть сохранены "пустые" символы перенос строки, табулятор итд.
В таких случаях можно очищать при импорте или прямо при сравнении.
Например рерулярными выражениями.
21 июн 17, 17:26    [20581379]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Alexander Us,
автор
Например рерулярными выражениями.
в ms sql завезли их?
21 июн 17, 17:28    [20581384]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
msLex
Member

Откуда:
Сообщений: 7726
TaPaK
Alexander Us,
автор
Например рерулярными выражениями.
в ms sql завезли их?

с CLR в MSSQL завезли почти всё.
21 июн 17, 17:32    [20581400]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
msLex
TaPaK
Alexander Us,
пропущено...
в ms sql завезли их?

с CLR в MSSQL завезли почти всё.
спасибо, как уберёте за собой, сообщите
21 июн 17, 17:33    [20581403]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Alexander Us
Member

Откуда:
Сообщений: 1091
TaPaK,

Нет, но это окупается 1000 раз: самому сделать пару SQLCLR функций для RegEx, или найти готовые.
21 июн 17, 17:34    [20581407]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7387
Alexander Us,

RegExp провоцирует к нехорошим вещам. Но иногда он сильно упрощает работу в какой-нибудь самобытной базе.
21 июн 17, 17:44    [20581433]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Alexander Us
Member

Откуда:
Сообщений: 1091
Владислав Колосов,

Согласен, но в дурных руках и SQL опасен.
А работу он упрощает, не знаю что без него бы делал.
21 июн 17, 17:52    [20581459]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Alexander Us
Владислав Колосов,

Согласен, но в дурных руках и SQL опасен.
А работу он упрощает, не знаю что без него бы делал.
конечно ведь бд это свалка, которую без регулярок то и не разберёшь, все мы мучаемся с этим. да...
21 июн 17, 17:54    [20581467]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7387
Упрощает на еретических таблицах :) Например, некоторые в текстовом поле хранят выходные в виде '00000110000011'.
21 июн 17, 18:40    [20581601]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7387
Вот в проверочных ограничениях могут быть полезны, например, проверка email или мобильного номера.
21 июн 17, 18:42    [20581607]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Alexander Us
Member

Откуда:
Сообщений: 1091
TaPaK
конечно ведь бд это свалка, которую без регулярок то и не разберёшь, все мы мучаемся с этим. да...

TaPaK,
Ваша ироиня неуместна, Ваш подход не конструктивен.

Возможно, Вы не можете представить ситуацию,
когда они нужны|полезны|экономят время.
Или круг Ваших задач не требует их.

Упреждая Ваш ответ: предлагаю оставаться в перделах поставленного вопроса и не скатываться в трёп.
С Уважением
21 июн 17, 22:26    [20581981]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
aleks2
Guest
Alexander Us
TaPaK
конечно ведь бд это свалка, которую без регулярок то и не разберёшь, все мы мучаемся с этим. да...

TaPaK,
Ваша ироиня неуместна, Ваш подход не конструктивен.

Возможно, Вы не можете представить ситуацию,
когда они нужны|полезны|экономят время.
Или круг Ваших задач не требует их.

Упреждая Ваш ответ: предлагаю оставаться в перделах поставленного вопроса и не скатываться в трёп.
С Уважением

Если быть точным: регулярные выражения не нужны никогда.
Это протекающий тормоз без ABS.
22 июн 17, 08:07    [20582310]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
aleks2
Alexander Us
пропущено...

TaPaK,
Ваша ироиня неуместна, Ваш подход не конструктивен.

Возможно, Вы не можете представить ситуацию,
когда они нужны|полезны|экономят время.
Или круг Ваших задач не требует их.

Упреждая Ваш ответ: предлагаю оставаться в перделах поставленного вопроса и не скатываться в трёп.
С Уважением

Если быть точным: регулярные выражения не нужны никогда.
Это протекающий тормоз без ABS.

да, если вам нужны регулярки это значить ваша архитектура хрень:)
22 июн 17, 08:57    [20582397]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Alexander Us
Member

Откуда:
Сообщений: 1091
TaPaK
если вам нужны регулярки это значить ваша архитектура хрень:)


TaPaK,
если Вам не надоело ещё ерундой заниматься:

В сети есть много англоязычных статей о применении RegEx на SQL Server.
Напишите им всем, что их архитектура - хрень.
Напишите ещё в MS, чтобы они забанили использование RegEx в следующих версиях SQL Server.

Чтобы Вас поняли правильно, отправьте писма 01 апреля.

ЗЫ: дальнейшее обсуждение предлагаю перенести в тему "трёп".
22 июн 17, 09:57    [20582560]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Alexander Us,

бить баранам головой в ворота не в силах мне запретить
22 июн 17, 09:58    [20582567]     Ответить | Цитировать Сообщить модератору
 Re: странности при сравнении строк  [new]
Alexander Us
Member

Откуда:
Сообщений: 1091
TaPaK
Alexander Us,
бить баранам головой в ворота не в силах мне запретить


Мир разнообразнее, чем Вы это себе представляете.
Ведь Вы рассуждаете с узкой точки зрения - технаря и Вашего личного опыта.
То, что Вы позволяете себе пренебрежительно высказываясься о других, говорит больше о Вас чем о них.
22 июн 17, 10:17    [20582620]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить