首页 > 解决方案 > 将图像的动态列表存储在 1 行中

问题描述

我正在加入这两个表,我想发送一个Test带有图像的视图。

现在我正在这样做:

SELECT Name, t.TestId, StartTime, Status, Image
FROM [Test] t
LEFT JOIN [Images] i ON i.TestId = t.TestId

我在这里不喜欢的是我有来自同一个测试的多行但有不同的图像。有没有一种方便的方法可以只返回每个测试的一行及其图像?

我的图像不是那么重(最大 100KB),而且每次测试我没有很多图像(最大 10 个)。这是我的想法:

  1. 这可能听起来很疯狂,但也许在 SQL Server 中,有一种方法可以将Images 转换为图像列表作为VARBINARY(MAX)
  2. 我可以在视图中有 10 列(image1、image2...),如果存在则用图像填充它们(非空)

我对这些解决方案有点坚持,因为我对 SQL 不太了解,但我仍在尝试。你看到另一种方法吗?如果没有,您能否就如何实现 1. 或 2 提供有用的建议。

标签: sql-servertsqljoingroup-byvarbinarymax

解决方案


我在这里不喜欢的是我有来自同一个测试的多行但有不同的图像。

所以呢?每行仅重复几个字节,与 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="
            }
        ]
    }
]

推荐阅读