|   |   | 
| 
 | Теряются разряды результата Pow(2, Х.Число) в запросе 1С на СУБД MSSQL | ☑ | ||
|---|---|---|---|---|
| 0
    
        TormozIT гуру 25.07.23✎ 08:40 | 
        Почему запрос
 ВЫБРАТЬ 60 КАК Число, 1 ПОМЕСТИТЬ Х; ВЫБРАТЬ Pow(2, Х.Число) - Pow(2, 60) ИЗ Х выдает не ноль на MSSQL? Текст запроса СУБД: 1. CREATE TABLE #tt14 (_Q_000_F_000 NUMERIC(2, 0)) 2. exec sp_executesql N'SELECT (CAST(POWER(CAST(@P1 AS NUMERIC(38, 6)),T1._Q_000_F_000) AS NUMERIC(38, 6)) - @P2) FROM #tt14 T1',N'@P1 numeric(10),@P2 numeric(38,8)',2,1152921504606846976.00000000 По сути имеем POWER(NUMERIC(38, 6),NUMERIC(2, 0)) который отрезает разряды после 17. Статья про округление MSSQL https://habr.com/ru/articles/205938 В файловой базе проблемы нет. | |||
| 1
    
        Мультук гуру 25.07.23✎ 08:51 | 
        (0) 
 Запустил в 1С:Предприятие 8.3 (8.3.22.1709) MS_SQL 18 Получил ноль | |||
| 2
    
        TormozIT гуру 25.07.23✎ 08:54 | 
        У меня MSSQL 12.0.2269.0     | |||
| 3
    
        TormozIT гуру 25.07.23✎ 08:56 | 
        У меня платформа 1С 8.3.23.1739     | |||
| 4
    
        TormozIT гуру 25.07.23✎ 09:00 | 
        Совсем чистый тест
 Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ 60 КАК Число, 1 ПОМЕСТИТЬ Х; |ВЫБРАТЬ Pow(2, Х.Число) - Pow(2, 60) ИЗ Х | |"; Сообщить(XMLСтрока(Запрос.Выполнить().Выгрузить()[0][0])); | |||
| 5
    
        TormozIT гуру 25.07.23✎ 09:26 | 
        Ну хоть повторить кто нибудь смог?     | |||
| 6
    
        timurhv 25.07.23✎ 09:52 | 
        (5) Тоже 0, запрос другой.
 8.3.23.1782 MSSQL 16.0.1000.6 exec sp_executesql N'INSERT INTO #tt3 WITH(TABLOCK) (_Q_000_F_000, _Q_000_F_001) SELECT P1, @P2',N'P1 numeric(10),@P2 numeric(10)',60,1 exec sp_executesql N'SELECT (CAST(POWER(CAST(P1 AS NUMERIC(38, 6)),T1._Q_000_F_000) AS NUMERIC(38, 6)) - CAST(POWER(CAST(@P2 AS NUMERIC(38, 6)),@P3) AS NUMERIC(38, 6))) FROM #tt3 T1 WITH(NOLOCK)',N'P1 numeric(10),@P2 numeric(10),@P3 numeric(10)',2,2,60 | |||
| 7
    
        TormozIT гуру 25.07.23✎ 10:02 | 
        (6) У тебя нет запроса CREATE TABLE. Поэтому непонятно какой тип у T1._Q_000_F_000 при выполнении POWER()     | |||
| 8
    
        Fragster гуру 25.07.23✎ 10:04 | ||||
| 9
    
        mikecool 25.07.23✎ 10:07 | 
        работа с плавающей точкой - всегда проблема     | |||
| 10
    
        TormozIT гуру 25.07.23✎ 10:10 | 
        На MSSQL 13.0.1601.5 и 1С 8.3.23.1782 возвращается 0.
 Значит уже в MSSQL 13 исправили. | |||
| 11
    
        TormozIT гуру 25.07.23✎ 10:13 | 
        (8) А что там написано по вопросу, чего нет в https://habr.com/ru/articles/205938/ ?     | |||
| 12
    
        Fragster гуру 25.07.23✎ 10:14 | 
        (11) хз, хабр не открывал даже     | |||
| 13
    
        TormozIT гуру 25.07.23✎ 10:16 | 
        (12) Кидаться широченными ссылками на документацию легко. А вот объяснить причину конкретной проблемы - намного сложнее.     | |||
| 14
    
        Fragster гуру 25.07.23✎ 10:20 | 
        создание временной таблицы делает точность 6 (1сная фича, вроде), операция pow возвращает float, который кастуется к точности колонки, тоже 6. почему вторая часть кастуется к 8 не очень понятно, может быть дефолт скуля     | |||
| 15
    
        Fragster гуру 25.07.23✎ 10:21 | 
        т.е. если ВЫБРАТЬ Выразить(60 КАК Число(38,8)) КАК Число, 1 ПОМЕСТИТЬ Х; толжно прокатить     | |||
| 16
    
        Fragster гуру 25.07.23✎ 10:21 | 
        *то должно     | |||
| 17
    
        TormozIT гуру 25.07.23✎ 10:24 | 
        (15) Пробовал делать ВЫРАЗИТЬ() во всех местах. Не помогает.     | |||
| 18
    
        TormozIT гуру 25.07.23✎ 10:25 | 
        (14) В (0) же четко написал CREATE TABLE #tt14 (_Q_000_F_000 NUMERIC(2, 0)). Откуда ты точность 6 взял?     | |||
| 19
    
        Fragster гуру 25.07.23✎ 11:27 | 
        (18) когда-то давно когда смотрел в создание временных таблиц 1с замечал, что для чисел там точность 6. может уже что-то изменилось. да и не константно я создавал, а из таблиц занчений     | |||
| 20
    
        НафНаф 25.07.23✎ 11:48 | 
        2^60 это вообще помещается еще в BIGINT     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |