D-W*_*D-W 2 sql t-sql sql-server
我需要Varbinary(max)
从SQL Server列中取一个并将其插入另一varbinary
列,但是当通过新字段显示时我的图像不会呈现,我做错了什么?
我从SQL Server复制,即
E7D28201A240202178EF491E413EB4DDBCFB54A15077A989A37A0C5E4E0F143AEE7000CE3F3A70C0E4F342E524C8F4A7243888AA581EC051B030E7A8EF4E233DF.....
Run Code Online (Sandbox Code Playgroud)
然后
update client
set Photo = convert(varbinary(max),'E7D28201A240202178EF491E413EB4DDBCFB54A15077A989A37A0C5E4E0F143AEE7000CE3F3A70C0E4F342E524C8F4A7243888AA581EC051B030E7A8EF4E233DF.....')
where id='40946b09-81be-42b0-ae62-63182acb1e89'
Run Code Online (Sandbox Code Playgroud)
数据不是Base64编码的,因为它具有更大范围的字母字符,而此值是纯十六进制值(即0-9,AF).此外,OP提供的示例HTML代码(在对问题的评论中)是:
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)
Run Code Online (Sandbox Code Playgroud)
这表明源值Model.PhotoDisplay
首先转换为 Base64,以便data:image;base64
类型指定正确.
问题是SQL Server在被要求转换值时,不知道它已经是十六进制/二进制字符串.您需要告诉SQL Server源数据的格式是什么.这可以通过两种方式完成:
根据您构建此值的方式,您只需添加0x
前缀并删除单引号:
UPDATE cl
SET cl.Photo = CONVERT(VARBINARY(MAX), 0xE7D28201A24020.....)
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
Run Code Online (Sandbox Code Playgroud)如果您需要将值保留为字符串,并且正在使用SQL Server 2008或更高版本,那么您可以使用CONVERT函数的"style"选项告诉SQL Server它是二进制值,并且您还有其他选项的
添加0x
前缀并使用"样式" 1
:
UPDATE cl
SET cl.Photo = CONVERT(VARBINARY(MAX), '0xE7D28201A24020.....', 1)
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
Run Code Online (Sandbox Code Playgroud)保持没有0x
前缀的值并使用"样式" 2
:
UPDATE cl
SET cl.Photo = CONVERT(VARBINARY(MAX), 'E7D28201A24020.....', 2)
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
Run Code Online (Sandbox Code Playgroud)但是,如果这些数据真的来自VARBINARY(MAX)
另一个表中的字段,那么它最初是如何以字符串形式结束的呢?移动它的最简单方法是:
在表之间直接传输数据:
UPDATE cl
SET cl.Photo = src.SomeField
FROM Client cl
INNER JOIN SomeTable src
ON src.JoinField = cl.JoinField
WHERE something? = somethingElse?;
Run Code Online (Sandbox Code Playgroud)使用VARBINARY(MAX)
变量:
DECLARE @Photo VARBINARY(MAX);
SELECT @Photo = src.photo
FROM SomeTable src
WHERE src.SomeField = ?;
UPDATE cl
SET cl.Photo = @Photo
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
Run Code Online (Sandbox Code Playgroud)