1

を返す SQL Server 関数をbigInt使用しており、これをトリガーで使用して、タイプの列に値を割り当てていますbigint。ただし、トリガーを実行すると、オーバーフロー例外が発生します ( Arithmetic overflow error converting expression to data type int.)。つまり、それを ではなく として扱いますintbigint

機能は次のとおりです。

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

関数の最初の yyyy 部分から 2 つの '0' を削除すると、トリガーは成功しますが、そのままでは失敗します。

生成された値が big int より小さいことは明らかです。

何か案は?

アントン

4

2 に答える 2

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;
于 2013-09-18T03:39:30.387 に答える
0

DATEPART が int を返すためです。掛ける前に bigint にキャストしてみてください

cast (DATEPART(YYYY,@now) as bigint)*100000000
于 2013-09-18T03:39:13.030 に答える