19

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

PS.:数据库不在我的控制之下,所以改变数据类型不是一种选择。

4

6 回答 6

28

如果您安装了LinqPad,预览图像很简单。查询您的记录,将二进制数据转换为图像,然后将输出转储到预览窗口。

编辑:如果您不知道,LinqPad 是一个免费实用程序,可用于许多事情,例如替代管理工作室。大多数时候,我将它用作 .Net 的便签本,用于一次性程序、测试代码和示例。

var entity = // fetch data

using (var ms = new MemoryStream(entity.Image.ToArray()))
{
    System.Drawing.Image.FromStream(ms).Dump();
}

结果如下:

在此处输入图像描述

于 2014-07-02T14:56:38.520 回答
19

我会编写一个 proc(或查询;见下文)将二进制文件导出到文件系统,然后使用任何旧的现成照片管理实用程序(即 Windows 照片查看器)来查看里面的内容。

如果您在文件命名方面很聪明,您可以为自己提供有关名称中每个图像的足够信息,以便在您直观地找到您要查找的内容后再次在数据库中快速找到它。

这是一个将二进制文件导出到文件系统的过程。我从这个示例代码修改。它未经测试,但应该非常接近概念。它使用 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

当然,这一切都假设存储在 Image 列中的内容实际上是图像而不是其他文件类型。希望如果它是图像,您也知道类型、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
于 2012-05-07T17:01:18.513 回答
10

图像类型不是用于存储图像,它只是“可变长度的二进制数据” 。此类型已弃用,您现在应该将 varbinary(max) 用于可变长度二进制数据。

由于 SQL Server 不知道存储了哪种类型的二进制数据(.zip、.exe、.jpg、.anything),因此 Management Studio 不提供预览也就不足为奇了。

您肯定无法在 Managment Studio 中预览这些数据类型,但我喜欢 @RTomas 提供的解决方案。

于 2012-05-07T15:21:01.697 回答
8

SSMS SSMSBoost有一个非常棒的插件,它提供了大量有用的功能,当然也是预览存储在 SQL 中的图像的最简单方法(至少在我看来)

注意:安装此插件后,您必须重新启动 SSMS。

安装它并享受预览图像的乐趣:右键单击 > 可视化为 > 图片

于 2018-01-21T09:44:57.870 回答
4

我不知道在 Management Studio 中实现此目的的方法。您可能会更好地编写一个简单的应用程序来查询数据库,然后将十六进制转换为正确的图像类型(.jpg、.png 等)。还有一些商业应用程序可以为您执行此操作。

于 2012-05-04T19:29:50.103 回答
2

使用 linqpad 代码可以变得更加简单

那些你在二进制数据列上拥有实体/类型的人,你会看到.ToImage()方法

就我而言,我正在遍历所有行并将所有二进制列发布到图像。

希望能帮助到你。

var yourData_Or_List = // fetch data
DataItem_Or_ListItem.BinaryDataColumn.ToImage().Dump();

liqpad 二进制数据到图像

于 2018-09-02T15:06:42.700 回答