动态Sql转换插入varbinary数据

时间:2013-05-07 08:31:01

标签: sql sql-server

我一直陷入动态的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()吗?我认为这是一个不好的解决方案,但不太确定

提前感谢 马可

2 个答案:

答案 0 :(得分:2)

我不确定你为什么要面对这个问题。但是,不要将@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

答案 1 :(得分:0)

尝试将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
)
')