2016-07-27 14 views
0

Ich führe eine gespeicherte Prozedur aus, die Gebühren zum Einfügen, Aktualisieren und Löschen von Tabelleneinträgen enthält. Während sowohl das Einfügen als auch das Löschen problemlos ausgeführt wird, aktualisiert der Aktualisierungsvorgang alle Spalten außer DATETIME2.MSSQL DateTime2 konnte nicht aktualisiert werden

Das Szenario - ich meine Repository-Muster testen (unter Verwendung von C# -Code) in folgenden Weise:

  1. löschen Sie die gesamte [BackgroundTaskAttachtment] Tabelle
  2. erstellen 4 neue Einträge
  3. einzigen Eintrag auf Schritt erstellt lösche 2
  4. Warten für 5 Sekunden
  5. einen der Einträge ändern

das Ergebnis 3 Einträge in [BackgroundTaskAttachtment] Tabelle hat, mit allen Eigenschaften wie erwartet, mit Ausnahme des [UpdatedOnUtc], die nicht aktualisiert werden (es ist gleich [CreatedOnUtc]

ich die aktualisierte Zeile markiert (wie Sie [FilePath] sehen erfolgreich aktualisiert) wurde: enter image description here Einsichten Gemeinschaft schätzen würde,

Danke

Dies ist der Code der gespeicherten Prozedur:

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 

Dies ist der Tabellentyp (von CLR SQL gesendet)

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 

dies ist die Tabellendefinition

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

Antwort

0

Bitte versuchen SYSUTCDATETIME mit der datetime2 zurückgibt. Die von Ihnen verwendete GETUTCDATE gibt datetime zurück.

+0

Nein - es hat nicht geholfen - immer noch das gleiche Problem –