Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 вычисляемое поле и индекс  [new]
нуб987
Guest
создал вычисляемое поле DocNoNum:
CREATE TABLE Table1
	(
	DocNo varchar(20) NULL,
	DocNoNum  AS case when (isnumeric([DocNo]) = 1) then (convert(int,[DocNo])) else 0 end,
        .....
        )

попытался создать индекс по нему:
CREATE NONCLUSTERED INDEX fwm_DocNoNum ON Table1
	(
	DocNoNum
	) WITH FILLFACTOR = 90 ON [PRIMARY]

вылезла ошибка:
автор
Syntax error converting the varchar value '887990.1' to a column of data type int.
The statement has been terminated.


Т.е. где-то в таблице есть запись, у которой в поле DocNo есть значение '887990.1', которое не может быть преобразовано в int.
При этом запрос:
select * from Table1
where DocNo = '887990.1'

вываливается с той же ошибкой:
автор
Syntax error converting the varchar value '887990.1' to a column of data type int.


Как оно вообще могло получиться? Ведь в вычисляемом поле "если не число, значит 0. Если число, преобразовываем в int"
4 июл 12, 00:19    [12812978]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а теперь внимательно читаем описание изнамерика
никто инта не обещал - только некий числовой тип
лайк вам в руки, короче
4 июл 12, 00:28    [12813008]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
GlebZ
Member

Откуда: USA
Сообщений: 286
нуб987,

А вы считаете, что 887990.1 это не число?
4 июл 12, 00:29    [12813014]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
так у меня как бы железный int в результате должен быть:
then (convert(int,[DocNo])) else 0
даже "else 0", а не какой-нибудь "else 0.0"
Откуда в вычисляемом поле ошибки?
4 июл 12, 00:36    [12813039]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
Читаем внимательно -- ISNUMERIC (Transact-SQL).
Особенно раздел "Замечания"
4 июл 12, 00:37    [12813045]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Crimean
Member

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

перечитайте еще раз что вам написали. число - это не только инт. это еще и флоат и децимал, ага?
4 июл 12, 00:38    [12813049]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
кстати,
select * from Table1
where DocNo like '887990%'

сначала возвращает несколько записей, а потом через доли секунды появляется вышеописанная ошибка
4 июл 12, 00:38    [12813050]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
Crimean
нуб987,
перечитайте еще раз что вам написали. число - это не только инт. это еще и флоат и децимал, ага?

перечитал
я ведь в итоге все равно конверчу число в int. Так в чем ошибка-то?
4 июл 12, 00:41    [12813054]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Crimean
Member

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

ну так число с точкой в инт как бэ не конвертится. или сервер непонятно пишет?
4 июл 12, 00:43    [12813062]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
Crimean
нуб987,
ну так число с точкой в инт как бэ не конвертится. или сервер непонятно пишет?

млииин.....
select isnumeric('887990.1')
возвращает 1

select convert(int, '887990.1')
возвращает ошибку....

тогда подскажите плз, как быть? Нужно преобразовать поле DocNo в числовое (int), где это возможно. А там, где невозможно, 0
4 июл 12, 00:48    [12813084]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Crimean
Member

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

для начала начать внимательно читать - уже все сказано. местами по 3 раза
4 июл 12, 00:49    [12813090]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
пардон. Видимо, к ночи туплю...
я почему-то был уверен, что convert(int, <любое ЧИСЛО>) преобразует это число в int.
И все понять не мог, почему он точку "нормально" не воспринимает. Типа запятую ему что ли подавай?

Тогда подскажите еще плз, такой вариант:
DocNoNum AS case when (isnumeric([DocNo]) = 1) then (convert(int, round(DocNo, 0))) else 0 end

спасет от граблей?
4 июл 12, 01:00    [12813110]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
млин, теперь индекс создать не могу.
На вот это:
CREATE NONCLUSTERED INDEX fwm_DocNoNum ON Table1
	(
	DocNoNum
	) WITH FILLFACTOR = 90 ON [PRIMARY]

пишет:
автор
Cannot create index because the key column 'DocNoNum' is non-deterministic or imprecise.

Вычисляемое поле вроде детерминировано (всегда возвращает одно и то же значение) и точнО (тип int).
Чего я опять неправильно делаю?
4 июл 12, 01:54    [12813226]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
нуб987
Вычисляемое поле вроде детерминировано (всегда возвращает одно и то же значение)
А как вы учерены что одно и тоже? А если я поменяю настройки соединения или сервера?
Детерминированные и недетерминированные функции
4 июл 12, 10:07    [12813868]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
нуб987
спасет от граблей?
Скуль не обладает интеллектом, в него вшиты конкретные алгоритмы.
4 июл 12, 10:10    [12813880]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Попробуйте создать вычисляемое поле как PERSISTED.

Сообщение было отредактировано: 4 июл 12, 10:22
4 июл 12, 10:22    [12813958]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
Mnior
нуб987
Вычисляемое поле вроде детерминировано (всегда возвращает одно и то же значение)
А как вы учерены что одно и тоже? А если я поменяю настройки соединения или сервера?
Детерминированные и недетерминированные функции

ну поменяйте настройки и что изменится?
Допустим, какая-то запись в поле DocNo имеет значение '123aaa', тогда в DocNoNum будет всегда 0.
И допустим какая-то запись имеет значение 456, тогда DocNoNum будет 456.
Какие настройки сервера могут на это повлиять?
По приведенной вами ссылке сказано, что функция Round (которая используется в вычисляемом поле) всегда детерминирована. Convert в моем случае так же детерминирован (не конвертятся даты и не используется тип sql_variant).
Так где там недетерминированность или неточность (результат всегда int)?
4 июл 12, 11:35    [12814628]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
нуб987,

Creating Indexes on Computed Columns
См. раздел "Precision Requirements".
4 июл 12, 11:46    [12814792]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
invm
нуб987,

Creating Indexes on Computed Columns
См. раздел "Precision Requirements".

вы намекаете на раздел "Требования к точности"?
Там в примере дано поле y, которое принимает int'овое значение в зависимости от значения поля float. И типа оно в итоге не может быть точным.
Т.е. видимо, т.к. у меня есть преобразование строки в число (где могут быть и числа с точкой), итоговое поле не может быть точным. Так?
4 июл 12, 11:52    [12814875]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
нуб987
Mnior
пропущено...
А как вы учерены что одно и тоже? А если я поменяю настройки соединения или сервера?
Детерминированные и недетерминированные функции

ну поменяйте настройки и что изменится?
Мы не видели Вашу последнюю версию вычисляемого поля.
Но если там присутствует LIKE, к примеру, то на её работу может в теории повлиять COLLATE или ANSI_PADDING.
Если Вы не можете представить, как могут повлиять настройки, то это не значит, что такого влияния нет
4 июл 12, 11:53    [12814888]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
select columnproperty(object_id('Table1', 'U'), 'DocNoNum', 'IsPrecise');
4 июл 12, 11:56    [12814920]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
нуб987
Guest
iap
нуб987
пропущено...

ну поменяйте настройки и что изменится?
Мы не видели Вашу последнюю версию вычисляемого поля.
Но если там присутствует LIKE, к примеру, то на её работу может в теории повлиять COLLATE или ANSI_PADDING.
Если Вы не можете представить, как могут повлиять настройки, то это не значит, что такого влияния нет

да я не говорю, что влияния нет. Я просто понять не могу, что это за влияние такое.
А последний вариант я приводил, где спрашивал про грабли. Вот он:
нуб987
DocNoNum AS case when (isnumeric([DocNo]) = 1) then (convert(int, round(DocNo, 0))) else 0 end


но если учитывать точность и что в DocNo может быть число типа float (пусть и в строковом варианте), тогда да - "нельзя создать индекс по этому полю, т.к. оно или недетерминировано или неточно"

invm
select columnproperty(object_id('Table1', 'U'), 'DocNoNum', 'IsPrecise');

возвращает 0
4 июл 12, 12:42    [12815320]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
нуб987,

Ну вот вы сами и ответили на свой вопрос. Делайте столбец persisted, как посоветовал pkarklin, тогда сможете создать индекс.
4 июл 12, 12:47    [12815359]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
+ OffTop (риторический)
нуб987
Допустим, какая-то запись в поле DocNo имеет значение '123aaa', тогда в DocNoNum будет всегда 0.
И допустим какая-то запись имеет значение 456, тогда DocNoNum будет 456.
Согласен, я не видел нигде нормальный школьный курс логики, половина её в итоге не понимают, а из оставшейся половины не могут её повседневно полноценно использовать. (При этом у многих оценки максимальные)
PS: Доказать/опровергнуть можно только от обратного. Данные никак не влияют на алгоритмы. Приводить какой либо пример не имело смысла (при не знании).
PPS: Хотя математика в вакууме к конкретным алгоритмам имеет опосредованное отношение. (уже писал выше)
PPPS: Чтобы сделать выражение "детерминированным" (по mssql) часто нужно выяпнуться даже в казалось "гарантированных" случаях. Селяви.

КО
4 июл 12, 23:12    [12819316]     Ответить | Цитировать Сообщить модератору
 Re: вычисляемое поле и индекс  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3663
iap
нуб987
пропущено...

ну поменяйте настройки и что изменится?
Мы не видели Вашу последнюю версию вычисляемого поля.
Но если там присутствует LIKE, к примеру, то на её работу может в теории повлиять COLLATE или ANSI_PADDING.
Если Вы не можете представить, как могут повлиять настройки, то это не значит, что такого влияния нет

чё то я не понял на счет "повлиять COLLATE ".
На поле типа varchar и char COLLATE тоже влияет, однако это не межает индекс по таким полям строить и считать varchar вполне себе детерминистик
5 июл 12, 14:38    [12822476]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить