SQL Server插入Varbinary

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)

Sol*_*zky 7

数据不是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源数据的格式是什么.这可以通过两种方式完成:

  1. 根据您构建此值的方式,您只需添加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)
  2. 如果您需要将值保留为字符串,并且正在使用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)