SQL Server通过迭代字段名将映像导出到hardisc



我们通过移动设备应用程序接收到10张varchar格式的图像,这些图像存储在表格的一条记录中。导入图像的字段名为ImportPictureData、ImportPictureData2,。。。

[ID] [int] IDENTITY(1,1) NOT NULL,
[Projectnumber] [varchar](20) NULL,
[DeviceID] [nchar](20) NULL,
[Sendtime] [datetime] NULL,
[DeviceName] [nchar](30) NULL,
[ImportPictureData] [varchar](max) NULL,
[PictureData] [varbinary](max) NULL,
[ImportPictureData2] [varchar](max) NULL,
[PictureData2] [varbinary](max) NULL,
[ImportPictureData3] [varchar](max) NULL,
[PictureData3] [varbinary](max) NULL,
[ImportPictureData4] [varchar](max) NULL,
[PictureData4] [varbinary](max) NULL,
[ImportPictureData5] [varchar](max) NULL,
[PictureData5] [varbinary](max) NULL,
[ImportPictureData6] [varchar](max) NULL,
[PictureData6] [varbinary](max) NULL,
[ImportPictureData7] [varchar](max) NULL,
[PictureData7] [varbinary](max) NULL,
[ImportPictureData8] [varchar](max) NULL,
[PictureData8] [varbinary](max) NULL,
[ImportPictureData9] [varchar](max) NULL,
[PictureData9] [varbinary](max) NULL,

可以添加更多的importfield。

为了使导出更加灵活,我读取了表变量中的字段名,并尝试通过字段为循环创建一个动态SQL。

SQL字符串在我创建字符串并打印它的地方看起来很好(!(,然后我尝试将字符串分配给应该接收图像数据的变量:

set @sqlDynamicString='(Select Cast('''' AS XML).value(''xs:base64Binary(sql:column("'+ @PictureDateFieldName + '"))'', ''VARBINARY(MAX)'') FROM ScanIT_tblProjektbilder  Where ID='''+ @PicID +''')'

创建以下字符串:

(Select Cast('' AS XML).value('xs:base64Binary(sql:column("ImportPictureData"))', 'VARBINARY(MAX)') FROM ScanIT_tblProjektbilder  Where ID='105')
DECLARE @ImageData VARBINARY(max);
select @ImageData = (Select Cast('' AS XML).value('xs:base64Binary(sql:column("ImportPictureData"))', 'VARBINARY(MAX)') FROM ScanIT_tblProjektbilder  Where ID='105')

当我将这个字符串作为硬拷贝分配给变量@ImageData时,如果我要将变量@sqlDynamicString分配给像一样的变量@ImageData,我不会得到任何错误

select @ImageData = @sqlDynamicString

我有

error 257: Implicit conversion from datatype 'VARCHAR' to 'VARBINARY(MAX)' is not allowed. Use CONVERT-Function

这里出了什么问题??即使使用convert iso cast,我也会得到同样的错误。

感谢

在@sqlDynamicString中执行代码,将结果存储在临时表中,然后分配给varbinary变量。

create table #temp
(
imageData varbinary(max)
)
insert into #temp
exec @sqlDynamicString
select @ImageData=(select imageData from #temp)

最新更新