2016-07-27 25 views
0

Imストアドプロシージャを実行しているため、テーブルのエントリを挿入、更新、および削除することができます。 挿入と削除の両方がスムーズに実行されている間に、更新操作によってDATETIME2を除くすべての列が更新されます。 MSSQL DateTime2の更新に失敗する

  • 4つの新しいエントリを作成する全体[BackgroundTaskAttachtment]テーブルを削除

    1. ステップ2で作成された単一のエントリを削除する: -

      シナリオIは、次のように(C#コードを使用して)私のリポジトリのパターンをテストします

    2. 5秒
    3. 待ちエントリ
    01の1を変更

    [UpdatedOnUtc】更新されなかった以外は、結果は(あなたが見ることができるように、私は更新された行を(マーク[CreatedOnUtc]

    に等しい[FilePath]、予想されるように設定されたすべての特性を有する、[BackgroundTaskAttachtment]表3のエントリーを有しています成功裏に)更新されました: 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 
    

    これは、(SQLへCLRから送られた)テーブルタイプが

    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 
    ); 
    
  • 答えて

    0

    datetime2を返すSYSUTCDATETIMEを使用してみてくださいされています。 使用しているGETUTCDATEは、datetimeを返します。

    +0

    いいえ - それは役に立たなかった - まだ同じ問題がある –

    関連する問題