SQL Server 插入变量

标签 sql sql-server tsql

我需要带一个 Varbinary(max)从 SQL Server 列并将其插入另一个 varbinary列,但是我的图像在通过新字段显示时没有呈现,我做错了什么?

我从 SQL Server 复制过来的,即

E7D28201A240202178EF491E413EB4DDBCFB54A15077A989A37A0C5E4E0F143AEE7000CE3F3A70C0E4F342E524C8F4A7243888AA581EC051B030E7A8EF4E233DF.....

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

最佳答案

数据不是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 源数据的格式是什么。这可以通过两种方式完成:
  • 根据您构建此值的方式,您只需添加 0x前缀并删除单引号:

    UPDATE cl
    SET    cl.Photo = CONVERT(VARBINARY(MAX), 0xE7D28201A24020.....)
    FROM   Client cl
    WHERE  cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
    
  • 如果您需要将值保留为字符串,并且使用 SQL Server 2008 或更新版本,那么您可以使用 CONVERT 的“样式”选项。函数告诉 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';
    
  • 保留没有 0x 的值前缀并使用 2 的“样式” :

    UPDATE cl
    SET    cl.Photo = CONVERT(VARBINARY(MAX), 'E7D28201A24020.....', 2)
    FROM   Client cl
    WHERE  cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
    

  • 但是,如果这些数据真的来自 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';
    
  • 关于SQL Server 插入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35411679/

    相关文章:

    tsql - 使用脚本从 bak 文件恢复最新备份

    tsql - 用于表到表插入的 SSIS 与(仅限 SQL)INSERT INTO () SELECT FROM 方法

    php - 时间戳困惑 : solution for concurrency issue

    sql - Oracle 10 如何更新一个表作为总和

    mysql - 使用 DateTime 函数检查预订日期的订阅

    sql - 获取今天午夜的日期和时间并添加到其中

    sql-server - SSISDB 错误成功报告

    sql-server - Sql Server - 使用 Windows 身份验证连接

    sql-server - Microsoft T-SQL 计算连续记录

    php - 使用 Mysql 和 PHP 在表中汇总