четверг, 20 августа 2009 г.

Лучше не попадать в глубокий дебаг...

Бывают ситуации,когда из-за серии ошибок одного, или нескольких людей возникают глюки, избавиться от которых невероятно сложно - даже если корень лежит на поверхности.
Никак не могу приучить себя выходить из подобных ситуаций, глубоко вздохнуть, посчитать до десяти, успокоиться, подумать, и найти первопричину.

Вот к примеру сегодня. Есть, некий, далеко не самый маленький SQL запрос. Для общего понимания сути, я его, естественно, упрощу

SELECT 
  SUM(S.SomeValue)
FROM  SomeTable S
WHERE S.Date > GETDATE()

Все, вроде бы, понятно. Запускаю запрос в отладчике, получаю значение суммы. Затем запускаю клиентское приложение – получаю другое значение суммы! Первая мысль, что в отладчике указал неправильные значения переменных. Проверяю – вроде, все нормально. Затем, проверяю, правильные ли параметры передаются в запрос – тоже все правильно. После этого, меня начинает колбасить, и я начинаю задалбывать коллег со словами: “А не мог бы ты посмотреть запрос?” (Вове, спасибо).

В, общем, время, которое можно было бы провести попивая кофе в беседке ушло на борьбу с ветряными мельницами:(

А логика примерно следующая:
1. Поле S.Date – не datetime, а varchar. Таблицу SomeTable создавал не я, но пора бы привыкнуть к подобным особенностям базы.
2. В отладчик и клиентское приложение мы ходим под разными пользователями. Я когда себе недавно создавал пользователя не доглядел, что в региональных настройках поставил для него British English, а не просто English. А это разные вещи.
3. В зависимости от региональных настроек текущего пользователя сервер автоматом по разному кастил строку к формату даты, или дату к формату строки(?). И каждый раз в выходной набор попадали различные значения.

Было потеряно уйму времени, только ради того, чтобы прийти к выводу, что в данном случае поле S.Date нужно конвертировать явно.

В общем, приятной всем отладки:)