MSSQL DateTime2无法更新

时间:2016-07-27 07:06:10

标签: sql-server stored-procedures datetime2

我正在运行存储过程,负责插入,更新和删除表的条目。 虽然插入和删除都可以顺利运行,但更新操作会更新除DATETIME2之外的所有列。

场景 - 我以下列方式测试我的Repository模式(使用C#代码):

  1. 删除整个[BackgroundTaskAttachtment]表格
  2. 创建4个新条目
  3. 删除在第2步中创建的单个条目
  4. 等待5秒
  5. 修改其中一个条目
  6. 结果是在[BackgroundTaskAttachtment]表中有3个条目,所有属性都按预期设置,除了[UpdatedOnUtc]没有更新(它等于[CreatedOnUtc]

    我标记了更新的行(如您所见[FilePath]已成功更新): enter image description here 非常感谢社区的见解,

    谢谢

    这是存储过程代码:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[SP_ArrangeBackgroundTaskAttachtments]
    (
        @backgroundTaskId   BIGINT,
        @taskAttchs         [dbo].[BackgroundTaskAttachtmentType] READONLY
    )
    
    AS
    
    BEGIN
        SET NOCOUNT ON;
        --delete all removed attachtments
        DELETE FROM [BackgroundTaskAttachtment] 
        WHERE [BackgroundTaskId] = @backgroundTaskId AND [Id] NOT IN (SELECT [Id] FROM @taskAttchs)
    
    
    ----Update exist key-value pairs
    UPDATE [dbo].[BackgroundTaskAttachtment]
    SET 
        [IsPrimary] = attachs.[IsPrimary], 
        [FilePath] = attachs.[FilePath],
        [Bytes] = attachs.[Bytes],
        [UpdatedOnUtc] = GETUTCDATE()
    FROM @taskAttchs AS attachs
    WHERE attachs.[Id] = [BackgroundTaskAttachtment].[Id]
    
    --insert new records
    SELECT @backgroundTaskId AS [BackgroundTaskId], [FilePath], [IsPrimary], [Bytes], GETUTCDATE() AS [CreatedOnUtc], GETUTCDATE() AS [UpdatedOnUtc]
    INTO #Temp FROM @taskAttchs as atcs
    WHERE atcs.[Id] NOT IN (SELECT [Id] FROM [BackgroundTaskAttachtment] AS bta WHERE bta.[BackgroundTaskId] = @backgroundTaskId )
    
        INSERT INTO [BackgroundTaskAttachtment]([BackgroundTaskId], [IsPrimary], [Bytes], [FilePath], [CreatedOnUtc], [UpdatedOnUtc] )
        SELECT [BackgroundTaskId], [IsPrimary], [Bytes], [FilePath], [CreatedOnUtc], [UpdatedOnUtc]
        FROM #Temp
    END
    

    这是表类型(从CLR发送到SQL)

    CREATE TYPE [dbo].[BackgroundTaskAttachtmentType] AS TABLE(
    
        [Id]                    [BIGINT]            NOT NULL,
        [FilePath]              [NVARCHAR](MAX)     NULL,
        [IsPrimary]             [BIT]               NOT NULL,
        [BackgroundTaskId]      [BIGINT]            NULL,
        [Bytes]                 [VARBINARY](MAX)    NULL
        )
    GO
    

    这是表格定义

    CREATE TABLE [dbo].[BackgroundTaskAttachtment]
    (
        [Id]                    BIGINT          IDENTITY(1,1)           NOT NULL,
        [BackgroundTaskId]      BIGINT                                  NOT NULL,
        [IsPrimary]             BIT                                     NOT NULL        DEFAULT 0,
        [FilePath]              NVARCHAR(MAX)                           NULL,
        [Bytes]                 VARBINARY(MAX)                          NULL,
        [CreatedOnUtc]          DATETIME2                               NOT NULL,
        [UpdatedOnUtc]          DATETIME2                               NOT NULL,
        [RowVersion]            ROWVERSION                              NOT NULL,
    
        CONSTRAINT [PK_dbo.BackgroundTaskAttachtment] PRIMARY KEY   CLUSTERED ([Id] ASC),
        CONSTRAINT [FK_dbo.BackgroundTaskAttachtment_BackgroundTask_Id]
            FOREIGN KEY ([BackgroundTaskId])
            REFERENCES [dbo].[BackgroundTask] ([Id])
            ON DELETE CASCADE
    );
    

1 个答案:

答案 0 :(得分:0)

请尝试使用返回datetime2SYSUTCDATETIME。 您使用的GETUTCDATE会返回datetime