Почему арифметическая ошибка переполнения при преобразовании выражения в тип данных int разрешается сама собой? - PullRequest
0 голосов
/ 06 ноября 2019

В задании возникла ошибка

Арифметическая ошибка переполнения при преобразовании выражения в тип данных int. Ниже приведен запрос

DDL таблиц

 CREATE TABLE [dbo].[Approvals](
    userr_id [int] NOT NULL,
    appro_id [int] NOT NULL,
    app_units [decimal](9, 2) NOT NULL,
    c_units [tinyint] NOT NULL,
    usedunits [decimal](9, 2) NOT NULL,
    deleted [bit] NOT NULL
) 

INSERT INTO approvals 
VALUES
(4262,  29, 36.00,  1,  0.00,   0),
(1717,  30, 24.00,  1,  0.00,   0),
(4743,  31, 76.00,  1,  0.00,   0),
(4460,  33, 36.00,  1,  0.00,   0),
(4488,  35, 36.00,  1,  0.00,   0),
(3871,  36, 24.00,  1,  0.00,   0),
(3561,  37, 12.00,  1,  3.00,   0),
(4828,  38, 36.00,  1,  0.00,   0),
(3828,  39, 24.00,  1,  0.00,   0),
(4101,  40, 24.00,  1,  0.00,   0)

CREATE TABLE [dbo].[Visit](
    userr_id [int] NULL,
    appro_id [int] NULL,
    c_secondary [bit] NULL,
    auth_exceeded [bit] NOT NULL,
    tperiod [int] NOT NULL,
    contratrate [decimal](9, 2) NOT NULL
) 

INSERT INTO visit 
VALUES
(5329,  NULL,   0, 0,   419,    0.00),
(4262,  NULL,   0, 0,   419,    0.00),
(5244,  NULL,   0, 0, 419,  0.00),
(4205,  NULL,   0, 0,   419,    0.00),
(4828,  NULL,   0, 0,   419,    0.00),
(5531,  NULL,   0,0,    419,    0.00),
(5558,  NULL,   0,  0, 419, 0.00),
(4460,  NULL,   0,  0, 419, 0.00),
(5547,  NULL,   0,  0, 419, 0.00),
(5219,  NULL,   0,  0, 419, 0.00)

Хранимая процедура:

CREATE PROCEDURE [dbo].[stored_procedure] 
AS 

DECLARE @userr_id Int, @cnt Int
SET @cnt = 0

DECLARE c CURSOR FOR


    SELECT DISTINCT userr_id 
      FROM (SELECT userr_id, app_units, c_units, usedunits,
                   (SELECT count(*) FROM Visit WHERE c_secondary = 0 and appro_id = Approvals.appro_id and auth_exceeded = 0) AS count_notexceeded,
                   (SELECT count(*) FROM Visit WHERE c_secondary = 0 and appro_id = Approvals.appro_id ) AS count_all,
                   (SELECT SUM(tperiod) / 60.00 FROM Visit WHERE c_secondary = 0 and appro_id = Approvals.appro_id ) AS th_all,
                   (SELECT SUM(tperiod) / 60.00 FROM Visit WHERE c_secondary = 0 and appro_id = Approvals.appro_id and auth_exceeded = 0) AS th_notexceeded,
                   (SELECT SUM(contratrate) FROM Visit WHERE c_secondary = 0 and appro_id = Approvals.appro_id and auth_exceeded = 0) AS tr_notexceeded,
                   (SELECT SUM(contratrate) FROM Visit WHERE c_secondary = 0 and appro_id = Approvals.appro_id ) AS tr_all
              FROM Approvals where deleted = 0) t
     WHERE ((c_units = 0 and (count_all <> usedunits or count_notexceeded > app_units))
        OR  (c_units = 2 and (th_all <> usedunits or th_notexceeded > app_units))
        OR  (c_units = 3 and (tr_all <> usedunits or tr_notexceeded > app_units)))

 OPEN c
FETCH NEXT FROM c INTO @userr_id
WHILE @@fetch_status = 0
BEGIN
  SET @cnt = @cnt + 1

  EXEC [_name_of_another_stored_procedure] @userr_id

  FETCH NEXT FROM c INTO @userr_id
END
CLOSE c
DEALLOCATE c

Думаю, это можно исправить, изменив данныетип столбца от INT до BIGINT проверка, существует ли столбец со значением, превышающим то, что может содержать столбец типа данных int.

Тем не менее, оно разрешается само;и ошибка не всегда есть в базе данных.

Что бы это могло сделать? Любое возможное объяснение высоко ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...