Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Я набрёл на непонятное для меня поведение MSSQL7 (SP3) в довольно простой ситуации. Вот иллюстрирующий это скрипт: CREATE TABLE #a ( c nvarchar (1), i int PRIMARY KEY ) CREATE TABLE #b ( c nvarchar (1), d int PRIMARY KEY ) insert #a select nchar(1052), 1 insert #a select nchar(1084), 2 insert #b select nchar(1052), 10 insert #b select nchar(1084), 20 insert #b select nchar(1052), 30 insert #b select nchar(1084), 40 select * from #a select * from #b select b.c, b.d, (select a.c from #a a where unicode(a.c) = unicode(b.c) ) from #b b select b.c, b.d, a.c from #b b inner join #a a on unicode(a.c) = unicode(b.c) Результаты: c i ---- ----------- М 1 м 2 c d ---- ----------- М 10 м 20 М 30 м 40 (<!!!!!!!!!!!!!!!!!!!!!!!) c d ---- ----------- ---- М 10 М м 20 М М 30 М м 40 М (!!!!!!!!!!!!!!!!!!!!!!!> c d c ---- ----------- ---- М 10 М м 20 м М 30 М м 40 м Почему предпоследний запрос возвращает другой набор данных по сравнению с последним? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2001, 14:11 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Быть может, я не совсем отвечаю на Ваш вопрос, но по адресу: http://www.osp.ru/win2000/sql/2001/04/825.htm есть интересные рекомендации по поводу использования старого синтаксиса объединения в запросах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 05:47 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Благодарю за ответ! Правда, я не понял, какое отношение указанная статья имеет к моему случаю. Старое объединение - это "*=". Разве я его использовал? Проблема заключается в том, что 2 сходных запроса возвращают разные результаты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 07:03 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Дык просто, потому что запросы то не сходные (select Unicode(a.c) from #a a where unicode(a.c) = unicode(b.c)) Возвращает только одно занчение, и проверка unicode(a.c) = unicode(b.c) выполняется только один раз ну не ставятся ограничения до From Попрбуйте вставить значения в #b вот таким образом: insert #b select nchar(1084), 20 insert #b select nchar(1052), 10 insert #b select nchar(1052), 30 insert #b select nchar(1084), 40 На выходе получите: c d ---- ----------- ---- М 10 м м 20 м М 30 м м 40 м ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 07:20 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
2 Gennady: Вы считаете, что вложенный запрос выполняется только один раз, а не для каждой строки главного запроса? Так это не так! Если вставить insert #a select nchar(1052), 1 insert #a select nchar(1084), 2 insert #a select nchar(65), 3 insert #b select nchar(1052), 10 insert #b select nchar(1084), 20 insert #b select nchar(1052), 30 insert #b select nchar(1084), 40 insert #b select nchar(65), 50 Возвращает: c d ---- ----------- ---- М 10 М м 20 М М 30 М м 40 М A 50 A С уважением, Максим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 08:33 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
2 Максим Извиняюсь за совет не по делу. Ваша непонятка меня тоже увлекла. Самое интересное, что следующая конструкция: select b.c, b.d, (select b.c from #a a where unicode(b.c)=unicode(a.c)) from #b b select b.c, b.d, a.c from #b b inner join #a a on unicode(a.c) = unicode(b.c) Возвращает тоже: c d ---- ----------- ---- М 10 М м 20 М М 30 М м 40 М (4 row(s) affected) c d c ---- ----------- ---- М 10 М М 30 М м 20 м м 40 м (4 row(s) affected) ?????????????????????????????????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 09:32 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
2 Genady Похоже, что Вы правы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 09:45 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
2 Максим Не заметил Ваш последний ответ. Теперь не похоже, что Genady прав Значит это ошибка? Надо срочно пересмотреть весь свой код... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 09:59 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Нда... Сорри, был неправ, нес полную чушь Судя по всему в подзапросе почему то unicode каким то непонятным образом игнорируется если установки на сервере case insensetive. Вот такой вариант работает правильно: CREATE TABLE a ( c nvarchar (1) collate SQL_Latin1_General_CP1_CS_AS, i int PRIMARY KEY ) CREATE TABLE b ( c nvarchar (1)collate SQL_Latin1_General_CP1_CS_AS, d int PRIMARY KEY ) insert a select nchar(1052), 1 insert a select nchar(1084), 2 insert a select nchar(65), 3 insert b select nchar(1052), 10 insert b select nchar(1084), 20 insert b select nchar(1052), 30 insert b select nchar(1084), 40 insert b select nchar(65), 50 select a.c from a a, b b where unicode(a.c) = unicode(b.c) select * from a select * from b select b.c, b.d, (select a.c from a a where unicode(a.c) = unicode(b.c) ) from b b select b.c, b.d, a.c from b b inner join a a on unicode(a.c) = unicode(b.c) Почему так происходет не знаю, если порыться в BOL, то возможно можно найти ответ, но мне лень ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 10:38 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Дополнение к предыдущему: скрипт SET NOCOUNT ON CREATE TABLE #a ( c varchar (1), i int PRIMARY KEY ) CREATE TABLE #b ( c varchar (1), d int PRIMARY KEY ) insert #a select 'М', 1 insert #a select 'м', 2 insert #b select 'М', 10 insert #b select 'м', 20 insert #b select 'М', 30 insert #b select 'м', 40 select * from #a select * from #b select b.c, b.d, (select a.c from #a a where ascii(a.c) = ascii(b.c) ) from #b b select b.c, b.d, a.c from #b b inner join #a a on ascii(a.c) = ascii(b.c) работает аналогично. Так что дело не в Юникоде! Всё страннее и страннее! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 14:17 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Ну, наконец-то добрался ... Поздравляю Вас, приплыли. Сегодня на работе пол-дня разбирался и так и сяк ... Итого: 1. Проблема не в UNICODE!!! Попробуйте поставить ASCII (для соответствующего диапазона) ... и получите тот же самый эффект. 2. Проблема в новом движке! На 6.5 всё работает идеально (Sort Order - Case Insensitive и ASCII, естественно). На 7.0 и 2000 начинаются выщеописанные проблемы (Collation - Case Insensitive). 3. На 2000 можно уйти от проблемы, поставив для столбца NCHAR внешней таблицы Case Sensitive. Но ведь это не решение... Похоже на то, что в качестве значения используется "подправленное" значение символа, но ведь и сообщения о множественном наборе в подзапросе мы не получаем (Msg 512: Subquery returned more than 1 value ...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2001, 17:54 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Досточтимые сэры. На основе данной дискуссии и собственных раздумий я взял на себя смелость принять решение, что это безусловный баг, и запостил его под номером 354747. Как мы с вами знаем, это не означает, что он будет исправлен в SP2, если только фирма МаксимаФ не заключила контракт с PSS, т.к. баги, полученные от клиента, исправляются не в пример быстрее, чем пришедшие из полей. Что касается более отдаленных по времени событий, то оптимайзер Юкона в значительной степени переписывается, учитывая кучу всякого нереляционного дерьма, к-е он будет обязан поддерживать. Как бы то ни было, статья в Knowledge Base по этому поводу появится в самое ближайшее время; от имени тех, кому еще предстоит наступить на эти грабли, - спасибо Вам. Для особо честолюбивых: не считайте, что у вас отнят кусок славы, т.к. лично я ничего, кроме лишнего гемора, на этом не поимел. Ну что ж теперь делать... Коль скоро SQL Server - это наше все, то надо, по крайней мере, чтобы работать с ним было комфортно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2001, 17:27 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
2 Дед Маздай >Как мы с вами знаем, это не означает, что он будет исправлен в SP2 SP2 это как я понимаю для MS SQL2K, а в семерке этот баг будет исправлен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2001, 06:20 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Ответ Дед Маздая внёс некую торжественность в нашу дискуссию, которая наверное близка к завершению. Для меня было интересно узнать (от Фомпро), что это глюк, добавленный при создании 7-й версии. По крайней мере ясно, что баг можно обойти без особых проблем. Странно, что на него раньше никто не наткнулся. P.S. Договора на внеочередное исправление ошибок у меня, к сожалению, нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2001, 08:49 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
А я так и не понял о чем вы. У меня последний и предпоследний результат одинаковы c i ---- ----------- М 1 м 2 (2 row(s) affected) c d ---- ----------- М 10 м 20 М 30 м 40 (4 row(s) affected) c d ---- ----------- ---- М 10 М м 20 м М 30 М м 40 м (4 row(s) affected) c d c ---- ----------- ---- М 10 М м 20 м М 30 М м 40 м ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2001, 09:02 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Привет участникам от newcomer'а. 2 Дед Маздай >Как мы с вами знаем, это не означает, что он будет исправлен в SP2. У меня SQL2000 SP1, collation Cyrillic_General_CI_AS. Может я что-то не понял, но вот результат: Set Nocount On CREATE TABLE #a ( c nvarchar (1), i int PRIMARY KEY ) CREATE TABLE #b ( c nvarchar (1), d int PRIMARY KEY ) insert #a select nchar(1052), 1 insert #a select nchar(1084), 2 insert #b select nchar(1052), 10 insert #b select nchar(1084), 20 insert #b select nchar(1052), 30 insert #b select nchar(1084), 40 select * from #a select * from #b select b.c, b.d, (select a.c from #a a where unicode(a.c) = unicode(b.c) ) from #b b select b.c, b.d, a.c from #b b inner join #a a on unicode(a.c) = unicode(b.c) c i ---- ----------- М 1 м 2 c d ---- ----------- М 10 м 20 М 30 м 40 c d ---- ----------- ---- М 10 М м 20 м М 30 М м 40 м c d c ---- ----------- ---- М 10 М м 20 м М 30 М м 40 м Для ascii результат тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2001, 09:17 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Какие-то странные вещи вы говорите. Я же не из пальца, извините, высосал - проверял в том числе и на отсервиспаченной тачке - результат полностью соответствовал соответствовал тому, что было у MaximF. Похоже, кто-то из нас врет. Сделаем следующим образом. Я сейчас честно скачаю SP1, поставлю SQL Server на девственно чистую конфигурацию, накачу сервис-пак и прогоню повторно эти запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2001, 11:16 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Странно, у меня с использованием Cyrillic_General_CI_AS результат тот же, т. е. М 10 М м 20 М М 30 М м 40 М А 50 A Правда у меня сервер без SP1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2001, 11:58 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
Кажется, из нас врет я. (Блин, не люблю признавать за собой ошибки). Два сервера оказались просто коряво пропатченными. На одном стоял не SP1, а какой-то из его ранних билдов, на втором был вроде нормальный, но как-то криво вставший по причине Terminal Services или еще почему - не знаю. Он даже select @@version вон пишет 194, как будто его там в принципе нет, хотя при мне ставили. Вот на них по закону подлости я и проверил. Вообще на девелоперских машинах столько всякого добра стоит, что вообще удивительно, как это еще уживается. Все остальные тачки с SP1 подтвердили правоту SergSuper и mikeL. Ну, статистика статистикой, а эксперимент с нуля на голой машине тоже продемонстрировал, что в SP1 этот баг вылечен. Так что моя торжественность оказалась напрасной, но оно и к лучшему. Это ж как оперативно MS сработал: не успели, понимаешь, баг найти, а его уже пофиксили . Я еще под это дело бардак на серверах разгреб, хотя бы частично, что тоже радует. Ну что, полагаем вопрос закрытым? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2001, 15:12 |
|
||
|
Непонятка...
|
|||
|---|---|---|---|
|
#18+
>Ну что, полагаем вопрос закрытым? Возможно, правда у меня на семерке та же проблема, как правда и то что на семерке стоит только SP2, никто не скажет как оно на SP3? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 05:53 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32008908&tid=1826251]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 265ms |
| total: | 438ms |

| 0 / 0 |
