У меня проблема с DateTime
вставкой в SQL Server DateTime2(6)
тип данных. У меня есть переменная в C #, определенная как Datetime
:
public DateTime CreatedOn { get; set; }
Ниже указана дата, которую я передаю SQL Server:
Когда вы замечаете, что отметки createdon
заканчиваются на 786066. Но я объединил вышеприведенный datetime
с SQL Server, и после обновления я получаю различные наносекунды:
Последние четыре цифры меняются. Однако, когда я делаю групповое копирование в таблицу, даты вставляются просто отлично. Но когда я объединяю строку за строкой, нано секунды объединяются неправильно.
MERGE [dbo].[ItemAttribute] as tgt
USING
(VALUES(@FK_ItemAttributeGroupCode, @ItemAttributeCode, @Name, @Description,
@EffectiveDate, @TerminationDate, @DataType, @DefaultString,
@DefaultNumeric, @DefaultDate, @FK_ItemGroupTypeCode,
@IsPublishable, @AttributeType, @IsAutoDelete, @IsFacilitySpecific,
@CreatedBy, @CreatedOn, @LastUpdatedBy, @LastUpdatedOn)) AS src ([FK_ItemAttributeGroupCode], [ItemAttributeCode], [Name], [Description], [EffectiveDate], [TerminationDate], [DataType], [DefaultString], [DefaultNumeric], [DefaultDate], [FK_ItemGroupTypeCode], [IsPublishable], [AttributeType], [IsAutoDelete], [IsFacilitySpecific], [CreatedBy], [CreatedOn], [LastUpdatedBy], [LastUpdatedOn])
ON tgt.[FK_ItemAttributeGroupCode] = @FK_ItemAttributeGroupCode AND tgt.[ItemAttributeCode] = @ItemAttributeCode
WHEN MATCHED AND (EXISTS (SELECT TGT.[Name], TGT.[Description], TGT.[EffectiveDate], TGT.[TerminationDate], TGT.[DataType], TGT.[DefaultString], TGT.[DefaultNumeric], TGT.[DefaultDate], TGT.[FK_ItemGroupTypeCode], TGT.[IsPublishable], TGT.[AttributeType], TGT.[IsAutoDelete], TGT.[IsFacilitySpecific], TGT.[CreatedBy], TGT.[CreatedOn], TGT.[LastUpdatedBy], TGT.[LastUpdatedOn] EXCEPT SELECT @Name, @Description, @EffectiveDate, @TerminationDate, @DataType, @DefaultString, @DefaultNumeric, @DefaultDate, @FK_ItemGroupTypeCode, @IsPublishable, @AttributeType, @IsAutoDelete, @IsFacilitySpecific, @CreatedBy, @CreatedOn, @LastUpdatedBy, @LastUpdatedOn))
THEN
UPDATE
SET [FK_ItemAttributeGroupCode] = @FK_ItemAttributeGroupCode, [ItemAttributeCode] = @ItemAttributeCode, [Name] = @Name, [Description] = @Description, [EffectiveDate] = @EffectiveDate, [TerminationDate] = @TerminationDate, [DataType] = @DataType, [DefaultString] = @DefaultString, [DefaultNumeric] = @DefaultNumeric, [DefaultDate] = @DefaultDate, [FK_ItemGroupTypeCode] = @FK_ItemGroupTypeCode, [IsPublishable] = @IsPublishable, [AttributeType] = @AttributeType, [IsAutoDelete] = @IsAutoDelete, [IsFacilitySpecific] = @IsFacilitySpecific, [CreatedBy] = @CreatedBy, [CreatedOn] = @CreatedOn, [LastUpdatedBy] = @LastUpdatedBy, [LastUpdatedOn] = @LastUpdatedOn
WHEN NOT MATCHED
THEN
INSERT([FK_ItemAttributeGroupCode], [ItemAttributeCode], [Name], [Description], [EffectiveDate], [TerminationDate], [DataType], [DefaultString], [DefaultNumeric], [DefaultDate], [FK_ItemGroupTypeCode], [IsPublishable], [AttributeType], [IsAutoDelete], [IsFacilitySpecific], [CreatedBy], [CreatedOn], [LastUpdatedBy], [LastUpdatedOn])
VALUES(@FK_ItemAttributeGroupCode, @ItemAttributeCode, @Name, @Description, @EffectiveDate, @TerminationDate, @DataType, @DefaultString, @DefaultNumeric, @DefaultDate, @FK_ItemGroupTypeCode, @IsPublishable, @AttributeType, @IsAutoDelete, @IsFacilitySpecific, @CreatedBy, @CreatedOn, @LastUpdatedBy, @LastUpdatedOn);
Мы используем SQL Server 2016.
foreach (var entity in entities)
{
try
{
await conn.ExecuteAsync(sql, commandType: CommandType.Text, param: entity, commandTimeout: SQLCommandTimeOut);
}
}
Sql имеет вышеуказанный запрос на слияние, я передаю сущность в качестве параметра, а CreatedOn для сущности - DateTime. Однако вместо зацикливания и вставки в таблицу, если мы используем BulkCopy из C #, она вставляется правильно, так как фактический DateTime C # имеет значение до нано секунд, но вставка за строкой последние 4 цифры нано секунд отличаются, если вы заметили на скриншотах выше.
Любая помощь в этом?