admin

从图像列预览数据的最简单方法是什么?

sql

我有一些具有image数据类型的列,我想预览(或浏览)那些表中的数据。Select top 1000 rows在SQL Server
Management Studio中使用时,图像列的值以十六进制显示。因为十六进制值对我没有用,最简单的预览这些图像的方法是什么?

PS .:数据库不在我的控制之下,因此不能选择更改数据类型。


阅读 154

收藏
2021-05-10

共1个答案

admin

我将编写一个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
2021-05-10