【问题标题】:Dynamic Sql Convert inserting varbinary data动态 Sql 转换插入 varbinary 数据
【发布时间】:2013-05-07 08:31:00
【问题描述】:

我遇到了一个动态 sql 问题。 我需要能够将 varbinary (byte[]) 数据保存到我的表中。

这里是显示我的问题的示例代码:

ALTER PROCEDURE ins_photo
@schema VARCHAR(63), @name VARCHAR(50), @data VARBINARY(MAX)
AS

PRINT @data;

EXEC ('

PRINT '''+@data+''';

DECLARE @plswork VARBINARY(MAX) = CAST('''+@data+''' AS VARBINARY(MAX))

PRINT @plswork;

INSERT INTO '+@schema+'.Tester
(name, photo)
VALUES
(
'''+@name+''',
@plswork
)
')

这是输出:

0xFFD8FFE000104A4649460001010000
?????A
0x3F3F3F3F3F410100

(1 row(s) affected)

正如您在转换中会注意到的那样,初始二进制数据和“转换后的”是不同的,因此在检索二进制数据以显示图像时......什么也没有显示出来 :)

我非常感谢帮助,甚至是解决方法,但主要是这个 usp 需要根据架构调用不同的表。 (因此我使用动态 sql)

我可以将图像保存为 nvarchar(max) 并在客户端使用 ToBase64String() 吗?我认为这是一个糟糕的解决方案,但不太确定

提前致谢 马可

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    我不确定您为什么会遇到这个问题。但不要将 @data 连接到动态 sql 字符串,而是尝试将其作为参数传递。参考下面的例子。

    DECLARE @Color varchar(16) = 'Blue', @LastProduct varchar(64)
    SET @SQL =       N'SELECT @pLastProduct = max(Name)
                       FROM AdventureWorks2008.Production.Product
                       WHERE Color = @pColor'
    SET @ParmDefinition = N'@pColor varchar(16),
                            @pLastProduct varchar(64) OUTPUT'
    EXECUTE sp_executeSQL
                @SQL,
                @ParmDefinition,
                @pColor = @Color,
                @pLastProduct OUTPUT
    

    【讨论】:

      【解决方案2】:

      尝试将 VARCHAR 变量而不是 VARBINARY 发送到 EXEC 查询字符串中。

      添加

      DECLARE @dataCHAR VARCHAR(MAX);
      SET @dataCHAR = @data;
      

      所以程序看起来像:

      ALTER PROCEDURE ins_photo
      @schema VARCHAR(63), @name VARCHAR(50), @data VARBINARY(MAX)
      AS
      
      PRINT @data;
      
      DECLARE @dataCHAR VARCHAR(MAX);
      SET @dataCHAR = @data;
      
      EXEC ('
      
      PRINT '''+@dataCHAR+''';
      
      DECLARE @plswork VARBINARY(MAX) = CAST('''+@dataCHAR+''' AS VARBINARY(MAX))
      
      PRINT @plswork;
      
      INSERT INTO '+@schema+'.Tester
      (name, photo)
      VALUES
      (
      '''+@name+''',
      @plswork
      )
      ')
      

      【讨论】:

      • 感谢您的回复,它确实适用于小(非常小)图像,但较大的图像会失败......嗯
      • 对于我提出的问题,您的解决方案是正确的,所以非常感谢您,虽然我使用大图像,但另一个答案是“更多”正确..再次感谢您,但非常感谢
      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 2017-09-08
      • 1970-01-01
      • 2018-10-02
      • 2011-06-24
      • 2015-08-12
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多