sql - MERGE TABLES 中的转换失败
问题描述
我有两个TABLES
SOURCE_TABLE
TARGET_TABLE
我想更新旧记录并在TARGET_TABLE
from中插入新记录SOURCE_TABLE
,我用于MERGE
此操作。
注意:我有一个nvarchar
数据类型为 in的日期值,我有一个数据类型为 inSOURCE_TABLE
的日期值。datatime2
TARGET_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)
解决方案
为什么要将日期/时间存储为字符串?那是错误的格式。
您可以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;
推荐阅读
- python - 如何在pygame中更改文本?
- javascript - if 语句中未清除的清除间隔 [javascript]
- javascript - 通过更新变量来更新 Json 值
- php - 在 Laravel foreach 循环中设置变量
- nlp - 如何将长句子输入到 Transformer 模型中
- java - 应用程序在“后台并发复制 GC 释放”日志消息后空闲时冻结
- html - 如何在 HTML 的单行数据单元格中显示多个数据?
- angular - 动态添加到 RXJS Observables 的队列中
- android - 如何将 MutableList<> 放入实体(房间,Kotlin)
- visual-studio-code - 是否可以以编程方式从活动栏中选择一个项目?