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

Откуда: ближайшее заМКАДье
Сообщений: 4905
Всем добрый день.
Есть не очень понятная ситуация.

Есть процедура p1, которая работает раз в сутки по данным за вчерашний день. В ней скрипт, который берет данные из вьюхи, вставляет во времянку. Дальнейшие действия не существенные в текущем контексте.

С определенной даты джоб с процой перестал работать. Запустил вручную, выяснилось, что возвращает ошибку: "Conversion failed when converting the varchar value '-operator' to data type int".
При этом, если запустить этот же скрипт вне процедуры, то все нормально отрабатывает.

Если убрать в проце вставку во времянку, то тоже отрабатывает нормально.
При этом в выборке я не вижу ни в одном поле значения like '-operator' и даже не могу предположить, где оно может фигурировать.

Предполагаю, что дело во вьюхе, но не понятно, отчего разный результат.

Предположения:
1) Может от настроек SET, как в случае когда проце работает медленнее, чем скрипт в студии?
2) Запрос из вьюхи идет с фильтром по двум поля. Может оптимизатор как-то сначала оценивает выборку в целом из вьюхи, а только потом накладывает фильтр?

Структура времянки, куда выбираются данные из вьюхи:
CREATE TABLE #Tbl(
		[InsertTime] [datetime] NULL,
		[Queue_ID] [int] NULL,
		[SESSION_ID_1] [varchar](64) NULL,
		[Call_1] [varchar](20) NULL,	
		[CREATED_1] [datetime] NULL,
		[SESSION_ID_2] [varchar](64) NULL,
		[SESSION_ID_3] [varchar](64) NULL,
		[CONNECTED_3] [datetime] NULL,
	)		
- наверное что-то в

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

Буду благодарен любым наводкам.
---
Проходя мимо разложенных граблей, ты теряешь драгоценный опыт. (с)
11 окт 16, 18:17    [19770657]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертации при вызове процедуры, а в скрипте нет  [new]
iljy
Member

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

все банально: расчеты в зависимости от плана могут выполняться в разном порядке. Например, вот такой запрос

select cast(x as int) v from (values('1'),('abc')) t(x) where isnumeric(x) = 1

может отработать нормально, если фильтр выполнится до конвертации, а может свалиться. Всегда корректный запрос будет таким:

select case isnumeric(x) when 1 then cast(x as int) end v from (values('1'),('abc')) t(x) where isnumeric(x) = 1
11 окт 16, 20:35    [19771031]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертации при вызове процедуры, а в скрипте нет  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4905
iljy
Megabyte,

все банально: расчеты в зависимости от плана могут выполняться в разном порядке. Например, вот такой запрос

select cast(x as int) v from (values('1'),('abc')) t(x) where isnumeric(x) = 1

может отработать нормально, если фильтр выполнится до конвертации, а может свалиться. Всегда корректный запрос будет таким:

select case isnumeric(x) when 1 then cast(x as int) end v from (values('1'),('abc')) t(x) where isnumeric(x) = 1

Пасиб, подумаю
11 окт 16, 21:42    [19771219]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертации при вызове процедуры, а в скрипте нет  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
iljy
Всегда корректный запрос будет таким:

select case isnumeric(x) when 1 then cast(x as int) end v from (values('1'),('abc')) t(x) where isnumeric(x) = 1
iljy, ну как же так! :((
select case isnumeric(x) when 1 then cast(x as int) end v from (values('1'),('abc'),('1e+12')) t(x) where isnumeric(x) = 1
12 окт 16, 10:12    [19771994]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка конвертации при вызове процедуры, а в скрипте нет  [new]
iljy
Member

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

я просто как пример организации порядка вычислений, понятное дело, что isnumeric не обеспечивает стопроцентной проверки корректной записи целого числа. Там еще можно и просто '+' или '$' написать.
12 окт 16, 16:47    [19774454]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить