首页 > 解决方案 > SQL Server 通过遍历字段名将图像导出到硬盘

问题描述

我们通过移动设备应用程序接收 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,

可以添加更多的导入字段。

为了使导出更灵活,我读取了表变量中的字段名,并尝试为通过字段的循环创建动态 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 我也会得到同样的错误。

谢谢

标签: sqlsql-server

解决方案


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

create table #temp
(
imageData varbinary(max)
)

insert into #temp
exec @sqlDynamicString

select @ImageData=(select imageData from #temp)

推荐阅读