我在存储过程中有以下参数
@DatabaseName varchar(80)
@aImage image
@id int
查询我想执行
set @sql =' insert into '@txtDatabase+'..Documentimages(id,image)
values ('+ @id +', '+ @aImage + ' )
以上陈述不起作用。
请建议适当的。
答案 0 :(得分:1)
我的解决方案通过使用临时表来避免连接。 否则,您必须将IMAGE转换为VARCHAR(MAX),注入攻击的可能性会增加。
begin transaction
-- SETUP stuff
use dbapp
create table dscat.dbo.Documentimages (id int, [image] VARBINARY(max))
go
-- Your Prodcedure:
create procedure p_Test
@DatabaseName SYSNAME,
@aImage VARBINARY(max),
@id int
as
-- use a temp table to hold the data for the INSERT
SELECT @id as ID , @aImage as [aImage] INTO #ImageTemp
DECLARE @SQL VARCHAR(200)
set @sql =' insert into ['+ @DatabaseName +'].dbo.Documentimages(id,image)
SELECT ID, aImage FROM #ImageTemp'
EXEC (@sql)
GO
-- TEST IT: (not a valid image...)
EXEC p_test 'dscat',0xFFD8FFE000104A4649FDDC7FDF36D, 86
select *, DATALENGTH([image]) from dscat.dbo.Documentimages
ROLLBACK
我也冒昧使用
VARBINARY(max)
而不是已弃用的IMAGE
类型。 SYSNAME
表示数据库名称参数dbo
的{{1}};您的架构可能不同 - 但使用完全限定名称可简化动态执行。否则,SQL必须通过用户/执行上下文,并查看哪个模式是第一个拥有该表的模式...