sql - 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 我也会得到同样的错误。
谢谢
解决方案
执行@sqlDynamicString 中的代码,将结果存储在临时表中,然后分配给您的 varbinary 变量。
create table #temp
(
imageData varbinary(max)
)
insert into #temp
exec @sqlDynamicString
select @ImageData=(select imageData from #temp)
推荐阅读
- python - 遍历子目录,读取以给定名称开头的文件并追加
- dialogflow-es - 使用来自外部 nodejs 服务器的事件触发对话流意图
- ios - 在反应式编程中创建静态流是个坏主意吗?
- templates - 将特征 C++ 块表达式推回 std::vector
- sql - 以pageNumber和pagesize为输入参数的Oracle过程,应输出记录集显示错误
- javascript - 如何连接两个 HTML 元素避免其他元素
- java - Apache HttpClient 上的 TLS 版本
- swift - 属性包装器和 SwiftUI 环境:属性包装器如何访问其封闭对象的环境?
- asp.net-core - 如何在.net核心中创建由Auth0验证的自己的访问令牌
- swift - 记录alamofire上传图片请求和响应