我有以下 JSON 结构,并将其解析为 3 个表(预约、码头、仓库)。当所有 JSON 数据都有效时,可以非常快速地立即解析所有记录。当出现数据问题(只有 1 条记录)时,不会解析任何记录,因为该进程位于事务内,并且事务会回滚。我正在使用 OPENJSON 插入到每个表中。
这是预约表。其他 2 个非常相似或使用插入件。
UPDATE a
SET a.start = ss.start,
FROM dbo.Appointment a
CROSS APPLY
OPENJSON(a.payload, '$')
WITH (id UNIQUEIDENTIFIER,
start DATETIME) ss
INSERT dbo.Appointment_Dock
(
...
)
SELECT ...
FROM dbo.Appointment a
CROSS APPLY
OPENJSON(a.payload, '$.dock')
WITH (id UNIQUEIDENTIFIER,
...) ss
我可以使用另一个进程一次处理 1 条记录并保留有效记录并标记坏数据记录。问题是一次处理 1 条记录要慢得多。
当前引发的错误与将传入数据转换为适当的类型有关。我已手动设置错误数据值以进行测试。
将 nvarchar 值“错误”转换为数据类型日期时间时,转换失败。
{
"data": [
{
"id": "4940b7b9-7b30-42e7-8a0f-63f4095c75f4",
"start": "2023-11-17T20:00:00.000Z",
"dock": {
"id": "ca009877-6559-4fb2-afa7-d8c34e9cd819",
"name": "Door# 1",
"warehouseId": "30e9ad49-4faf-4d40-805c-9dc75e67d873",
"warehouse": {
"id": "30e9ad49-4faf-4d40-805c-9dc75e67d873",
"name": "Warehouse A"
}
}
},
{
"id": "4940b7b9-7b30-42e7-8a0f-63f4095c75f4",
"start": "2023-11-18T20:00:00.000Z",
"dock": {
"id": "ca009877-6559-4fb2-afa7-d8c34e9cd819",
"name": "Door# 1",
"warehouseId": "30e9ad49-4faf-4d40-805c-9dc75e67d873",
"warehouse": {
"id": "30e9ad49-4faf-4d40-805c-9dc75e67d873",
"name": "Warehouse A"
}
}
}
],
"entity": "Appointment",
"action": "read"
}
有没有一种方法可以用 SQL 编码来批量处理 JSON 记录并处理任何错误?处理错误意味着有效记录会存储其值,而问题记录只会获得包含错误消息的字段集。
我可以用 C# 编写所有逻辑,但我认为不通过网络传输所有数据只是为了将其解析到其他表中会更好/更快。
使用 CLR 会更好吗?
还有其他方法吗?
这里的典型策略是预处理数据以清理数据,以便可以可靠地批量传递到数据库。这可能是一个 C# 应用程序,但也可能类似于 SQL Server Integration Services。
由于您已经提取 json 数据进行预处理,因此该步骤通常以 SQL Server 更自然的格式输出数据,尤其是 BULK Insert 功能的 SQLBulkCopy。