powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Непонятка...
21 сообщений из 21, страница 1 из 1
Непонятка...
    #32008786
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я набрёл на непонятное для меня поведение 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 М
(!!!!!!!!!!!!!!!!!!!!!!!&gt

c d c
---- ----------- ----
М 10 М
м 20 м
М 30 М
м 40 м

Почему предпоследний запрос возвращает другой набор данных по сравнению с последним?
...
Рейтинг: 0 / 0
Непонятка...
    #32008827
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Быть может, я не совсем отвечаю на Ваш вопрос, но по адресу: http://www.osp.ru/win2000/sql/2001/04/825.htm
есть интересные рекомендации по поводу использования старого синтаксиса объединения в запросах.
...
Рейтинг: 0 / 0
Непонятка...
    #32008839
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю за ответ!

Правда, я не понял, какое отношение указанная статья имеет к моему случаю. Старое объединение - это "*=". Разве я его использовал?

Проблема заключается в том, что 2 сходных запроса возвращают разные результаты
...
Рейтинг: 0 / 0
Непонятка...
    #32008842
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык просто, потому что запросы то не сходные
(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 м
...
Рейтинг: 0 / 0
Непонятка...
    #32008850
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

С уважением, Максим
...
Рейтинг: 0 / 0
Непонятка...
    #32008861
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)
??????????????????????????????????
...
Рейтинг: 0 / 0
Непонятка...
    #32008862
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Genady
Похоже, что Вы правы
...
Рейтинг: 0 / 0
Непонятка...
    #32008864
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Максим
Не заметил Ваш последний ответ. Теперь не похоже, что Genady прав Значит это ошибка? Надо срочно пересмотреть весь свой код...
...
Рейтинг: 0 / 0
Непонятка...
    #32008868
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нда... Сорри, был неправ, нес полную чушь
Судя по всему в подзапросе почему то 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, то возможно можно найти ответ, но мне лень
...
Рейтинг: 0 / 0
Непонятка...
    #32008892
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение к предыдущему: скрипт

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)

работает аналогично. Так что дело не в Юникоде! Всё страннее и страннее!
...
Рейтинг: 0 / 0
Непонятка...
    #32008908
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, наконец-то добрался ...
Поздравляю Вас, приплыли. Сегодня на работе пол-дня разбирался и так и сяк ...
Итого:
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 ...).
...
Рейтинг: 0 / 0
Непонятка...
    #32008991
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Досточтимые сэры. На основе данной дискуссии и собственных раздумий я взял на себя смелость принять решение, что это безусловный баг, и запостил его под номером 354747. Как мы с вами знаем, это не означает, что он будет исправлен в SP2, если только фирма МаксимаФ не заключила контракт с PSS, т.к. баги, полученные от клиента, исправляются не в пример быстрее, чем пришедшие из полей. Что касается более отдаленных по времени событий, то оптимайзер Юкона в значительной степени переписывается, учитывая кучу всякого нереляционного дерьма, к-е он будет обязан поддерживать. Как бы то ни было, статья в Knowledge Base по этому поводу появится в самое ближайшее время; от имени тех, кому еще предстоит наступить на эти грабли, - спасибо Вам.
Для особо честолюбивых: не считайте, что у вас отнят кусок славы, т.к. лично я ничего, кроме лишнего гемора, на этом не поимел. Ну что ж теперь делать... Коль скоро SQL Server - это наше все, то надо, по крайней мере, чтобы работать с ним было комфортно.
...
Рейтинг: 0 / 0
Непонятка...
    #32009011
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дед Маздай
>Как мы с вами знаем, это не означает, что он будет исправлен в SP2

SP2 это как я понимаю для MS SQL2K, а в семерке этот баг будет исправлен?
...
Рейтинг: 0 / 0
Непонятка...
    #32009031
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ Дед Маздая внёс некую торжественность в нашу дискуссию, которая наверное близка к завершению.
Для меня было интересно узнать (от Фомпро), что это глюк, добавленный при создании 7-й версии. По крайней мере ясно, что баг можно обойти без особых проблем. Странно, что на него раньше никто не наткнулся.

P.S. Договора на внеочередное исправление ошибок у меня, к сожалению, нет.
...
Рейтинг: 0 / 0
Непонятка...
    #32009035
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я так и не понял о чем вы. У меня последний и предпоследний результат одинаковы


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 м
...
Рейтинг: 0 / 0
Непонятка...
    #32009039
mikeL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет участникам от 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 результат тот же.
...
Рейтинг: 0 / 0
Непонятка...
    #32009046
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие-то странные вещи вы говорите. Я же не из пальца, извините, высосал - проверял в том числе и на отсервиспаченной тачке - результат полностью соответствовал соответствовал тому, что было у MaximF. Похоже, кто-то из нас врет. Сделаем следующим образом. Я сейчас честно скачаю SP1, поставлю SQL Server на девственно чистую конфигурацию, накачу сервис-пак и прогоню повторно эти запросы.
...
Рейтинг: 0 / 0
Непонятка...
    #32009051
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, у меня с использованием Cyrillic_General_CI_AS результат тот же, т. е.
М 10 М
м 20 М
М 30 М
м 40 М
А 50 A

Правда у меня сервер без SP1
...
Рейтинг: 0 / 0
Непонятка...
    #32009075
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, из нас врет я. (Блин, не люблю признавать за собой ошибки). Два сервера оказались просто коряво пропатченными. На одном стоял не SP1, а какой-то из его ранних билдов, на втором был вроде нормальный, но как-то криво вставший по причине Terminal Services или еще почему - не знаю. Он даже select @@version вон пишет 194, как будто его там в принципе нет, хотя при мне ставили. Вот на них по закону подлости я и проверил. Вообще на девелоперских машинах столько всякого добра стоит, что вообще удивительно, как это еще уживается. Все остальные тачки с SP1 подтвердили правоту SergSuper и mikeL. Ну, статистика статистикой, а эксперимент с нуля на голой машине тоже продемонстрировал, что в SP1 этот баг вылечен. Так что моя торжественность оказалась напрасной, но оно и к лучшему. Это ж как оперативно MS сработал: не успели, понимаешь, баг найти, а его уже пофиксили . Я еще под это дело бардак на серверах разгреб, хотя бы частично, что тоже радует. Ну что, полагаем вопрос закрытым?
...
Рейтинг: 0 / 0
Непонятка...
    #32009118
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ну что, полагаем вопрос закрытым?
Возможно, правда у меня на семерке та же проблема, как правда и то что на семерке стоит только SP2, никто не скажет как оно на SP3?
...
Рейтинг: 0 / 0
Непонятка...
    #32009133
mikeL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Genady
>Возможно, правда у меня на семерке та же проблема, как правда и то что на семерке стоит только SP2, никто не скажет как оно на SP3?

На SP3 не лучше, что и обнаружил maximF.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Непонятка...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]