sql-server - 将图像的动态列表存储在 1 行中
问题描述
我正在加入这两个表,我想发送一个Test
带有图像的视图。
测试
- 名称 (VARCHAR(255))
- 测试 ID (INT)
- 开始时间 (DATETIME2(7))
- 状态 (VARCHAR(255))
图片
- 图像 ID (INT)
- 测试 ID (INT)
- 图像(VARBINARY(MAX))
现在我正在这样做:
SELECT Name, t.TestId, StartTime, Status, Image
FROM [Test] t
LEFT JOIN [Images] i ON i.TestId = t.TestId
我在这里不喜欢的是我有来自同一个测试的多行但有不同的图像。有没有一种方便的方法可以只返回每个测试的一行及其图像?
我的图像不是那么重(最大 100KB),而且每次测试我没有很多图像(最大 10 个)。这是我的想法:
- 这可能听起来很疯狂,但也许在 SQL Server 中,有一种方法可以将
Image
s 转换为图像列表作为VARBINARY(MAX)
- 我可以在视图中有 10 列(image1、image2...),如果存在则用图像填充它们(非空)
我对这些解决方案有点坚持,因为我对 SQL 不太了解,但我仍在尝试。你看到另一种方法吗?如果没有,您能否就如何实现 1. 或 2 提供有用的建议。
解决方案
我在这里不喜欢的是我有来自同一个测试的多行但有不同的图像。
所以呢?每行仅重复几个字节,与 100KB 的 blob 相比微不足道。
但是,如果您让 SQL Server 将其转换为 JSON,则可以完全按照您想要的形状检索数据。varbinary(max) 将被 base64 编码并添加所有 JSON 开销,这将是一个更大的结果大小。但是像这样的查询
SELECT Name ,
t.TestId ,
StartTime ,
Status ,
(select Image from Images where testid = t.testid for json path) Images
FROM [Test] t
for json path
将输出数据,如
[
{
"Name": "Test1",
"TestId": 1,
"StartTime": "2020-04-22T18:15:47.9533333",
"Status": "complete",
"Images": [
{
"Image": "j2LYPy9Uy0Wbz0/qsPk0qo9i2D8vVMtFm89P6rD5NKqPYtg/L1TLRZvPT+qw+TSqj2LYPy9Uy0Wbz0/qsPk0qo9i2D8vVMtFm89P6rD5NKo="
},
{
"Image": "j2LYPy9Uy0Wbz0/qsPk0qo9i2D8vVMtFm89P6rD5NKqPYtg/L1TLRZvPT+qw+TSqj2LYPy9Uy0Wbz0/qsPk0qo9i2D8vVMtFm89P6rD5NKo="
}
]
}
]
推荐阅读
- azure - 适用于 Kafka 的 Azure 事件中心。来自同一组的 2 个消费者无限地重新平衡
- javascript - Angular:focusout 事件不适用于 div 标签
- css - 使用 sass 连接字符串
- azure - 在 Azure API 管理器中管理版本化 API
- java - 如何正确构建包含名为 *(星号)的属性的 JSON
- javascript - REACT AXIOS:我正在做一个测验,每个任务在该索引中都有相应的选择数组
- linux - 如何在运行 Linux 的 VM 上获得 /dev/ptp0 ptp 硬件时钟?
- karate - 如何使用空手道实现基本身份验证?
- git - Laravel 播种不适用于克隆的存储库
- variables - 过滤 dvar 并在约束中使用