1

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

提前感谢马可

4

2 回答 2

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
于 2013-05-07T08:43:01.210 回答
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
)
')
于 2013-05-07T08:55:41.747 回答