首页 > 解决方案 > MERGE TABLES 中的转换失败

问题描述

我有两个TABLES

  1. SOURCE_TABLE
  2. TARGET_TABLE

我想更新旧记录并在TARGET_TABLEfrom中插入新记录SOURCE_TABLE,我用于MERGE此操作。

注意:我有一个nvarchar数据类型为 in的日期值,我有一个数据类型为 inSOURCE_TABLE的日期值。datatime2TARGET_TABLE

现在我该如何解决这个错误:

从字符串转换日期和/或时间时转换失败

这是我的代码:

CREATE TABLE [dbo].[SOURCE_TABLE]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](250) NULL,
    [Family] [nvarchar](250) NULL,
    [Priority] [nvarchar](max) NULL,
    [CreationDate] [nvarchar](250) NOT NULL
)

CREATE TABLE [dbo].[TARGET_TABLE]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](250) NULL,
    [Family] [nvarchar](250) NULL,
    [Priority] [nvarchar](max) NULL,
    [CreationDate] [datetime2] NOT NULL
)

MERGE TARGET_TABLE AS target 
USING SOURCE_TABLE AS source ON (target.ID = source.ID)

WHEN NOT MATCHED THEN
   INSERT ([Name], [Family], [Priority], [CreationDate]) 
   VALUES (source.Name, source.Family, source.Priority, 
           CONVERT(DATETIME, source.CreationDate, 101))

WHEN MATCHED THEN
   UPDATE SET target.Name = source.Name
              target.Family = source.Family 
              target.Priority = source.Priority
              target.CreationDate = CONVERT(DATETIME, source.CreationDate, 101)

标签: sqlsql-server

解决方案


为什么要将日期/时间存储为字符串?那是错误的格式。

您可以try_convert()用于转换:

VALUES (source.Name, source.Family, source.Priority, 
        TRY_CONVERT(DATETIME, source.CreationDate, 101)
       )

NULL但是,当它们不匹配时,它将返回。

您可能还会发现省略格式会给您带来更好的运气:

VALUES (source.Name, source.Family, source.Priority, 
        TRY_CONVERT(DATETIME, source.CreationDate)
       )

SQL Server 在将字符串转换为日期/时间方面非常复杂。

更重要的是,您应该找到失败的数据并修复数据——最好将列更改为正确的类型:

select s.*
from source_table s
where try_convert(datetime, s.CreationDate, 101) is null and
      s.CreationDate is not null;

推荐阅读