2013-09-18 4 views
1

Я использую функцию SQL Server, которая возвращает bigInt и использует это в триггере для присвоения значения столбцу типа bigint. Однако, когда я бегу на спусковой крючок, происходит исключение переполнения (Arithmetic overflow error converting expression to data type int.), т.е. он рассматривает его как int, а не bigintSQL Server FUNCTION overflow int vs bigint

Функция:

ALTER FUNCTION [dbo].[longIntDateTime]() 
RETURNS bigint 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @ResultVar bigint; 
    DECLARE @now Datetime; 

    set @now = getdate(); 
    SET @ResultVar=DATEPART(YYYY,@now)*100000000 + DATEPART(MM,@now)*1000000 + DATEPART(DD,@now)*10000 + DATEPART(HH,@now)*100; 
    -- DATEPART(HH,@now)*100 + DATEPART(MI,@now); 

    -- Return the result of the function 
    RETURN (@ResultVar); 
END 

Спусковой крючок:

ALTER TRIGGER [dbo].[employeesInsert] 
ON [dbo].[employees] 
AFTER INSERT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    UPDATE employees 
    SET changeTimeStamp = dbo.longIntDateTime() 
    FROM inserted INNER JOIN employees On inserted._id = employees._id 
END 

и определение таблицы:

CREATE TABLE [dbo].[employees](
    [_id] [int] IDENTITY(1,1) NOT NULL, 
    [employee_name] [varchar](50) NOT NULL, 
    [password] [varchar](50) NOT NULL, 
    [isActive] [int] NOT NULL, 
    [isDeleted] [int] NOT NULL, 
    [changeTimeStamp] [bigint] NOT NULL, 

    CONSTRAINT [PK_employees] PRIMARY KEY CLUSTERED ([_id] ASC) 
) 

ALTER TABLE [dbo].[employees] 
    ADD CONSTRAINT [DF_employees_isActive] DEFAULT ((0)) FOR [isActive] 

ALTER TABLE [dbo].[employees] 
    ADD CONSTRAINT [DF_employees_isDeleted] DEFAULT ((0)) FOR [isDeleted] 
GO 

Если я возьму два '0' с первой части yyyy функции, триггер будет успешным, но как бы то ни было, он терпит неудачу.

Очевидно, что произведенное значение меньше, чем большой int.

любые идеи?

антон

ответ

1

Проблема эта строка кода:

SET @ResultVar=DATEPART(YYYY,@now)*100000000 + DATEPART(MM,@now)*1000000 + DATEPART(DD,@now)*10000 + DATEPART(HH,@now)*100; 

константы интерпретируются как int поэтому весь расчет делается таким образом. Это можно легко исправить, лидируя первым до bigint:

SET @ResultVar=DATEPART(YYYY,@now)*cast(100000000 as bigint)+ DATEPART(MM,@now)*1000000 + DATEPART(DD,@now)*10000 + DATEPART(HH,@now)*100; 
0

Это потому, что DATEPART возвращает int.Try приведение к BigInt перед тем умножая

cast (DATEPART(YYYY,@now) as bigint)*100000000 
Смежные вопросы