SQL Server插入Varbinary

时间:2016-02-15 14:15:44

标签: sql sql-server tsql

我需要从SQL Server列中取一个Varbinary(max)并将其插入另一个varbinary列,但是当通过新字段显示时我的图像不呈现,我做错了什么?< / p>

我已从SQL Server复制,即

E7D28201A240202178EF491E413EB4DDBCFB54A15077A989A37A0C5E4E0F143AEE7000CE3F3A70C0E4F342E524C8F4A7243888AA581EC051B030E7A8EF4E233DF.....

然后

update client
set Photo = convert(varbinary(max),'E7D28201A240202178EF491E413EB4DDBCFB54A15077A989A37A0C5E4E0F143AEE7000CE3F3A70C0E4F342E524C8F4A7243888AA581EC051B030E7A8EF4E233DF.....')
where id='40946b09-81be-42b0-ae62-63182acb1e89'

2 个答案:

答案 0 :(得分:7)

数据不是Base64 encoded,因为它会有更大范围的字母字符,而这个值是纯十六进制值(即0-9,A-F)。此外,O.P。(在对问题的评论中)提供的示例HTML代码是:

<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay) 

显示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';
    
  2. 如果您需要将值保留为字符串,正在使用SQL Server 2008或更高版本,那么您可以使用&#34;样式&#34; CONVERT函数的选项告诉SQL Server它是二进制值,并且您还有

    的附加选项
    • 添加0x前缀并使用&#34;样式&#34; 1

      UPDATE cl
      SET    cl.Photo = CONVERT(VARBINARY(MAX), '0xE7D28201A24020.....', 1)
      FROM   Client cl
      WHERE  cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
      
    • 保留不带0x前缀的值并使用&#34;样式&#34; 2

      UPDATE cl
      SET    cl.Photo = CONVERT(VARBINARY(MAX), 'E7D28201A24020.....', 2)
      FROM   Client cl
      WHERE  cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
      
  3. 但是,如果这些数据真的来自另一个表中的VARBINARY(MAX)字段,那么它最初是如何以字符串形式结束的呢?移动它的最简单方法是:

    • 直接在表之间传输数据:

      UPDATE cl
      SET    cl.Photo = src.SomeField
      FROM   Client cl
      INNER JOIN SomeTable src
              ON src.JoinField = cl.JoinField
      WHERE something? = somethingElse?;
      
    • 使用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';
      

答案 1 :(得分:1)

为什么不直接使用SQL语句复制它,而不是从SSMS复制/粘贴?

我将留下一个示例来复制另一个客户端的数据(例如,伪造id):

UPDATE client
SET Photo = (SELECT Photo FROM client WHERE id='00000000-0000-0000-0000-000000000000')
WHERE id='40946b09-81be-42b0-ae62-63182acb1e89';