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