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

Откуда:
Сообщений: 16
Столкнулся с тем, что корректный на первый взгляд запрос выдает ошибку:
"Msg 537, Level 16, State 2, Line 1: Invalid length parameter passed to the LEFT or SUBSTRING function."

SELECT ПорядковыйНомер, CASE
WHEN CharIndex('.',КодСтр) > 1 and LTrim(Substring(КодСтр, 1, CharIndex('.',КодСтр)-1)) in ('А', 'Б', 'В', 'Г', 'Д') and Флаг<>0 and ТИПОПЕР = 7 and Операция = 6 and Дата < '20090101' THEN ISNULL((select Номер from Справочник where Код=ltrim(rtrim(Src.КодСтр))),0)
WHEN CharIndex('.',КодСтр) > 1 and LTrim(Substring(КодСтр, 1, CharIndex('.',КодСтр)-1)) in ('А', 'Б', 'В', 'Г', 'Д') and Флаг<>0 and ТИПОПЕР = 7 and Операция = 2 and Дата < '20090101' THEN ISNULL((select Номер from Справочник where Код=ltrim(rtrim(Src.КодСтр))),0)
WHEN CharIndex('.',КодСтр) > 1 and LTrim(Substring(КодСтр, 1, CharIndex('.',КодСтр)-1)) in ('А', 'Б', 'В', 'Г', 'Д') and Флаг<>0 and ТИПОПЕР = 7 and Операция = 7 and Дата < '20090101' THEN ISNULL((select Номер from Справочник where Код=ltrim(rtrim(Src.КодСтр))),0)
ELSE 0 
END as [Номер по справочнику]
FROM Источник Src

CREATE TABLE Справочник (Номер [int], Код [varchar](90))
CREATE TABLE Источник (ПорядковыйНомер [int], КодСтр [varchar](256), Флаг [int], ТИПОПЕР [int], Операция [int], Дата [datetime])
таблица Источник содержит порядка 400тыс записей, поле КодСтр содержит строки вида "А.123", "Б.12", "Х.17", " "

если в запросе:
- убрать одну из ветвей WHEN-THEN (любую)
- убрать одно из условий (например "and Флаг<>0")
- добавить условие where так, чтобы под условие попадало не более 107тыс записей
то запрос отрабатывает корректно.

Проблему обошел, переформулировав запрос:
SELECT ПорядковыйНомер, ISNULL((select Номер from Справочник where Код=CASE...END),0)
но может кто-нибудь знает что это за грабли, на которые я наступил? :)
12 авг 09, 11:12    [7526558]     Ответить | Цитировать Сообщить модератору
 Re: неадекватное поведение CASE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Этим граблям 100 лет в обед

select substring('aaaa', 1, -1)
12 авг 09, 11:15    [7526580]     Ответить | Цитировать Сообщить модератору
 Re: неадекватное поведение CASE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
План смотрите, что и в каком порядке вычисляется.
12 авг 09, 11:16    [7526597]     Ответить | Цитировать Сообщить модератору
 Re: неадекватное поведение CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Замените везде
CharIndex('.',КодСтр)-1
на
NULLIF(CharIndex('.',КодСтр),0)-1
Отсутствие точки в КодСтр будет игнорироваться.
Или добавьте внешний CASE, в котором проверяйте
WHEN CharIndex('.',КодСтр) > 1 THEN CASE ...
12 авг 09, 11:25    [7526685]     Ответить | Цитировать Сообщить модератору
 Re: неадекватное поведение CASE  [new]
Smey
Member

Откуда:
Сообщений: 16
спасибо :)
12 авг 09, 12:01    [7527019]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить