SSMS 不允许我在具有超过 32758 个字符的查询中将一系列字符作为 varbinary 创建插入

SSMS does not allow me to create insert a series of characters as varbinary in a query that has more than 32758 charactes

提问人:George 提问时间:1/16/2023 最后编辑:StuGeorge 更新时间:1/16/2023 访问量:47

问:

我们将图像存储在表的列中,然后在 SSRS 和我们的 Web 应用程序中使用。我们没有允许用户更新这些图像的前端,因为这种情况永远不会发生。varbinary(max)

我必须更新一系列图像,所以我认为,与其在某个地方为实际在客户端环境中更新的人提供图像,不如以某种方式插入包含图像的语句,以Single_Blob方式。我需要这个,因为在许多环境中,必须更新相同的内容,并且传输图像而不是 SQL 文件会造成极大的混乱

问题

我正在尝试将一列设置为静态字符系列varbinary

UPDATE [DBO].tableName
SET columnName = 0x89504E470D0A1A...............

它工作正常。

为了创建描述图像的一系列字符,我使用这个

SELECT *
FROM OPENROWSET (Bulk 'E:\....', Single_Blob) AS Image

并将所选值复制到上面显示的值中。SET columnName =

当它生成的字符系列大于 32758 个字符时,SSMS 中的查询行为异常 (它丢失了所有颜色) ,更新语句成功运行,但图像在读取后会中断。

如果我运行这个

UPDATE [DBO].tableName
SET columnName = BulkColumn
FROM OPENROWSET (Bulk 'E:\....', Single_Blob) AS Image

对于同一图像,它被正确地写入表,因为它被正确读取。

我知道它一直不是一个最佳解决方案,但我想知道我遇到的 32758 限制是什么,因为它在互联网上无处可去,这很奇怪。

SQL Server SSMS-18

评论

3赞 Thom A 1/16/2023
在网格模式下,单元格中显示的字符数最多默认为 32758,最多可设置为 65535。如果需要更多,请不要使用 SSMS 将数据复制到中。
1赞 Panagiotis Kanavos 1/16/2023
0x89504E470D0A1A是显示为十六进制值的二进制值,而不是一系列字符。SSMS 无法显示图像,因此它将二进制文件的第一部分显示为十六进制。这并不意味着字段中只存储了 32K 行。 如果没有 A 将替换所有行中的图像内容,则不插入单个图像。UPDATEWHERE
0赞 Panagiotis Kanavos 1/16/2023
你想做什么?虽然可以加载二进制文件,但它是有限的。它只能读取 SQL Server 服务帐户可访问的文件,例如本地文件或服务帐户可访问的共享文件夹中的文件。图像当然不应该在 SQL 脚本中作为十六进制值编写脚本。OPENROWSET (Bulk '....', Single_Blob)
0赞 George 1/16/2023
不带 WHERE 的 UPDATE 将替换所有行中的图像内容,而不是插入单个图像。我知道我只是为每个客户的数据库提供了一个行表,我不知道它的 HEX,所以我使用了一系列字符以免进一步混淆。
0赞 George 1/16/2023
图像当然不应该在 SQL 脚本中作为十六进制值编写脚本。我知道它很笨拙,但它可以工作,只要它不超过这个字符限制,它就会正确更新图像。@Larnu提到的“单元格中显示的字符”是原因,您建议使用什么方法来复制数据。此外,即使这是有道理的,我仍然无法将其视为限制。

答:

0赞 George 1/16/2023 #1

在评论中,我被指出了正确的方向。 在网格模式下,单元格中显示的字符数最多,默认情况下为 32758。 建议的解决方案是使用 ETL 工具。 我最终做了以下帖子中的建议:https://stackoverflow.com/a/11897999/17446997

它工作正常。