我有一些列的图像数据类型,我想预览(或浏览)这些表中的数据.当我使用sql Server Management Studio中选择前1000行时,图像列的值以十六进制显示.预览这些图像最简单的方法是什么,因为十六进制值对我没有用?
PS:数据库不在我的控制之下,所以改变数据类型不是一个选择.
解决方法
我会写一个proc(或查询;见下文)将二进制文件导出到文件系统,然后使用任何旧的现成的照片管理实用程序(即Windows Photo Viewer)来查看内部的内容.
如果您的文件命名中的聪明人,您可以在名称中为每个图像提供足够的信息,以便在视觉上找到所需的内容后,再次在数据库中重新找到它.
这是一个将二进制文件导出到文件系统的进程.我修改从this sample code.它是未经测试,但应该非常接近的概念.它使用BCP导出您的二进制文件.在这里查看full docs on the BCP utility.
该过程还使您能够导出表中的所有内容,或仅基于传递的主键单个行.它使用一个游标(yuck),以及一些动态的sql(yuck,yuck),但有时你必须做你应该做的.
CREATE PROCEDURE ExportMyImageFiles ( @PriKey INT,@OutputFilePath VARCHAR(500) ) AS BEGIN DECLARE @sql VARCHAR(8000) IF @PriKey IS NULL /* export all images */ BEGIN DECLARE curExportBinaryImgs CURSOR FAST_FORWARD FOR SELECT 'BCP "SELECT MyImage FROM [dbo].[MyTable] WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) + '" queryout ' + @OutputFilePath + MyImageName + '.' + MyImageType + ' -S MyServer\MyInstance -T -fC:\Documents.fmt' FROM [dbo].[MyTable] OPEN curExportBinaryImgs FETCH NEXT FROM curExportBinaryImgs INTO @sql WHILE @@FETCH_STATUS = 0 BEGIN EXEC xp_cmdshell @sql,NO_OUTPUT FETCH NEXT FROM curExportBinaryImgs INTO @sql END CLOSE curExportBinaryImgs DEALLOCATE curExportBinaryImgs END ELSE /* Export only the primary key provided */ BEGIN SELECT @sql = 'BCP "SELECT MyImage FROM [dbo].[MyTable] WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) + '" queryout ' + @OutputFilePath + MyImageName + '.' + MyImageType + ' -S MyServer\MyInstance -T -fC:\Documents.fmt' FROM [dbo].[MyTable] WHERE PrimaryKey = @PriKey EXEC xp_cmdshell @sql,NO_OUTPUT END END
这当然是假设您的图像列中存储的内容实际上是一个图像,而不是其他文件类型.希望如果它是一个图像,你也知道类型,bmp,jpg,png,gif等
如果你不想要这样一个完整的过程尝试单个查询的麻烦或可重用性:
DECLARE @OutputFilePath VarChar(500) = /* put output dir here */ DECLARE @sql VARCHAR(8000) DECLARE curExportBinaryImgs CURSOR FAST_FORWARD FOR SELECT 'BCP "SELECT MyImage FROM [dbo].[MyTable] WHERE PrimaryKey =' + CAST(PrimaryKey AS VARCHAR(25)) + '" queryout ' + @OutputFilePath + MyImageName + '.' + MyImageType + ' -S MyServer\MyInstance -T -fC:\Documents.fmt' FROM [dbo].[MyTable] OPEN curExportBinaryImgs FETCH NEXT FROM curExportBinaryImgs INTO @sql WHILE @@FETCH_STATUS = 0 BEGIN EXEC xp_cmdshell @sql,NO_OUTPUT FETCH NEXT FROM curExportBinaryImgs INTO @sql END CLOSE curExportBinaryImgs DEALLOCATE curExportBinaryImgs