我有一些具有image数据类型的列,我想预览(或浏览)那些表中的数据。Select top 1000 rows在SQL Server Management Studio中使用时,图像列的值以十六进制显示。因为十六进制值对我没有用,最简单的预览这些图像的方法是什么?
image
Select top 1000 rows
PS .:数据库不在我的控制之下,因此不能选择更改数据类型。
我将编写一个proc(或查询;请参见下文)以将二进制文件导出到文件系统中,然后使用任何旧的现成的照片管理实用程序 (即Windows Photo Viewer) 来查看其中的内容。
如果您巧妙地命名文件,则可以在名称中为自己提供足够的信息,以便在视觉上找到要查找的内容后立即在数据库中再次找到它。
这是将二进制文件导出到文件系统的proc。我从此示例代码进行了修改。它未经测试,但在概念上应该非常接近。它使用BCP导出二进制文件。在此处查看有关BCP实用程序的完整文档。
proc还使您能够导出表中的所有内容,或仅基于已传递的主键导出一行。它使用游标(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