0

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

场景 - 我通过以下方式测试我的存储库模式(使用 C# 代码):

  1. 删除整个[BackgroundTaskAttachtment]
  2. 创建 4 个新条目
  3. 删除在步骤 2 中创建的单个条目
  4. 等待 5 秒
  5. 修改其中一项

结果是[BackgroundTaskAttachtment]表中有 3 个条目,所有属性都按预期设置,但未更新的 [UpdatedOnUtc] 除外(它等于 [CreatedOnUtc]

我标记了更新的行(如您所见[FilePath]已成功更新): 在此处输入图像描述 感谢社区见解,

谢谢

这是存储过程代码:

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
);
4

1 回答 1

0

请尝试使用SYSUTCDATETIMEwhich returns datetime2。您正在使用的GETUTCDATE返回datetime.

于 2016-07-27T07:11:58.993 回答