Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094

Теряется дробная часть при вставке дробного числа из триггера

19.04.2017, 18:06. Показов 5805. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
2012 server.

В таблице изменил тип данных с int на decimal(18,1).
Теперь триггер, который который раньше вставлял int не может вставить decimal. Происходит потеря дробной части.

на всякий случай:
... да я исправил триггер чтобы он вставлял в таблицу decimal a не int

что пробовал:
1. взять код триггера и с мнимальными изменениями как есть запустить в виде отдельного скрипта. Все работает. Дробная часть вставляется.
2. Удалил, создал триггер.
3. Курил гугл.

В чем может быть прична? Подозреваю, что это какое-то кэширование. Например, вьюха после изменния тип данны столбца таблицы с которой она связана работать не будет (создал удалил - все заработало).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2017, 18:06
Ответы с готовыми решениями:

Теряется дробная часть числа
не пойму никак что за фигня с типом double, ему в программе присваивается частное от деления некоторых чисел, так вот в отладчике смотрю, а...

При переводе string в long double теряется дробная часть
Помогите с программой. При переводе string в long double дробная часть становится равной нулю(не зависит от длины числа). #include...

Определить, превышает ли умноженная на 10 дробная часть числа его целую часть
Определить превышает ли умноженная на 10 дробная часть числа m/n целую часть m/n . Если превышает, то вывести значение на сколько

11
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
19.04.2017, 18:16
Текст триггера прикажете угадать?
Подозреваю, что считываете значение в переменную, тип переменной изменить забыли.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
19.04.2017, 19:31  [ТС]
Цитата Сообщение от _katon_ Посмотреть сообщение
на всякий случай:
... да я исправил триггер чтобы он вставлял в таблицу decimal a не int
поразительно...
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
19.04.2017, 19:50
Цитата Сообщение от _katon_ Посмотреть сообщение
поразительно...
Ну продолжайте поражаться дальше.
Возможно кто-нибудь сумеет нателепатировать текст триггера и укажет вам на ошибку.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
20.04.2017, 16:16  [ТС]
В порядке эксперимента добавил в таблицу тествое поле c типом decimal(18,1).
Итог:
<Брал одну и туже переменную для заполнения обоих полей.>
Во вновь добавленное поле с типом decimal(18,1) значение пишется с остатком.
В "старое" поле, измененное с int на decimal(18,1), значение пишется без остатка.

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

Добавлено через 5 часов 51 минуту
Удаление полей и создание их занова с теми же названиями, не заставили insert правильно работать в триггере.

Вопрос решился только созданим полей с похожими названиями и сразу нужными типами данных. Лично для себя сделал вывод, что поля таблицы лучше не изменять вообще.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
20.04.2017, 16:25
Цитата Сообщение от _katon_ Посмотреть сообщение
Удаление полей и создание их занова с теми же названиями, не заставили insert правильно работать в триггере.
может триггер стоило пересоздать? наверняка же они компилируются каким-то образом
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
20.04.2017, 16:31  [ТС]
Цитата Сообщение от _katon_ Посмотреть сообщение
2. Удалил, создал триггер.
Более того. Удалил триггер - создал с новым именем. Результат тот же.

Добавлено через 1 минуту
Загадка еще, что insert не работает именно из триггера. Тот же код запросом проходит так как надо.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
20.04.2017, 16:36
секретный код неправильно работающего триггера мы так и не увидим?
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
20.04.2017, 17:13  [ТС]
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
ALTER TRIGGER [dbo].[CreateInsert]
ON [DATABASE]
after INSERT 
AS
BEGIN 
    SET NOCOUNT ON;
    SET XACT_ABORT OFF
 
    BEGIN try
        SAVE TRANSACTION InsertSaveHere;
        
            ...
            
            DECLARE @DecimaVar DECIMAL(18,1);
            SET @DecimaVar = 999,6
 
            INSERT INTO InsertTable(ChangedDecimaField, NewDecimaField)
            VALUES(@DecimaVar , @DecimaVar)
            --result
            --999,0 999,6
 
    END try
 
    BEGIN catch
 
        DECLARE @ErrorMsg VARCHAR(MAX), @ErrorNumber INT, @ErrorProc sysname, @ErrorLine INT 
 
        SELECT @ErrorMsg = ERROR_MESSAGE(), @ErrorNumber = ERROR_NUMBER(), @ErrorProc = ERROR_PROCEDURE(), @ErrorLine = ERROR_LINE();
        ROLLBACK TRANSACTION InsertSaveHere;
 
        INSERT INTO ErrorLog (ErrorMsg,  ErrorNumber,  ErrorProc,  ErrorLine)
        VALUES (@ErrorMsg, @ErrorNumber, @ErrorProc, @ErrorLine)
 
    END catch
 
END
Естественно это адаптация. В триггере тоже самое, только другие названия объектов.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
20.04.2017, 17:51
Цитата Сообщение от _katon_ Посмотреть сообщение
адаптация работает без нареканий
первое поле целое, второе dec. Записано из триггера
999999,6
первое поле преобразовано в dec
первая строка записана ранее, вторая - в преобразованное поле. триггер даже не менял
999,0999,6
999,6999,6
1
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
20.04.2017, 18:43  [ТС]
Именно так и ожидалось, что это должно работать. Но не работает (поэтому и топик на форуме). Почему? Я не знаю! Просьба выложить сюда информацию о версии сервера, чтобы знать где точно я не столкнусь с такой проблемой.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
20.04.2017, 21:12
Цитата Сообщение от _katon_ Посмотреть сообщение
Теперь точно уверен, что это какое-то кэширование.
Кешируются планы выполнения. При измении типов столбцов, все планы выполнения, где эти столбцы задействованы, инвалидируются и удаляются из кеша. Возможен вариант, когда инвалидируется только отдельная инструкция в плане.
При следующем выполнении триггера план будет скомпилирован полностью или будут перекомпилированы отдельные инструкции. Соответствующие события можно отследить профайлером - SP:CacheMiss или SP:Recompile.
Если таковых не будет, значит вы нарвались на какой-то баг. Возможно, сей баг уже был пофикшен в каком-либо SP или CU. Поэтому желательно увидеть результат выполнения select @@version с вашего сервера.

Если при выполнении insert потребовалось неявное приведение типа, это будет видно в плане выполнения - в итераторе Table Insert (Clustered Index Insert) должен быть вызов CONVERT_IMPLICIT.

Думаю, что вылечить можно не создавая новые столбцы, а выполнив alter table ... rebuild.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2017, 21:12
Помогаю со студенческими работами здесь

Отбросить дробную часть числа, если дробная часть равна нулю
Всем доброго времени суток, каким образом можно устроить проверку равна ли дробная часть числа нулю. Заранее благодарен.

Разделить дробное число на 2 части: целая часть числа и его дробная часть
Пользователь вводит с клавиатуры сумму в валюте (дробное число). Вывести по отдельности количество Рублей и количество копеек (например,...

Выяснить что больше, целая часть числа x, или его дробная часть, умноженная на 10
1)Ввести число x, выяснить что больше: целая часть числа x, или его дробная часть, умноженная на 10. Если первое, то число разделить на...

Ввести число x, выяснить что больше : целая часть числа x или его дробная часть умноженная на 10
Ввести число x, выяснить что больше : целая часть числа x или его дробная часть умноженная на 10. Если первое то число разделить на 10 ...

Ввести число x, выяснить что больше: целая часть числа x, или его дробная часть, умноженная на 10
Ввести число x, выяснить что больше: целая часть числа x, или его дробная часть, умноженная на 10. Если первое, то число разделить на 10,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru