当前位置: 首页 > 面试题库 >

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

彭飞虎
2023-03-14
问题内容

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

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


 类似资料:
  • 问题内容: 在Java中,数组不会覆盖toString(),因此,如果您尝试直接打印一个数组,则得到数组的十六进制,如下所示: 但是通常情况下,我们实际上会想要更多类似的东西。最简单的方法是什么?以下是一些示例输入和输出: 问题答案: 从Java 5开始,您可以;然后将或用于数组中的数组。请注意,版本调用数组中的每个对象。输出甚至以您要求的确切方式修饰。 例子: 简单数组: 输出: 嵌套数组: 输

  • 问题内容: 反转此ArrayList的最简单方法是什么? 问题答案: 示例(参考):

  • 反转这个ArrayList的最简单方法是什么?

  • 问题内容: 我想创建一个函数,例如: 可以给定文件和调整大小的位置。 当前函数的效果很好,只是在必要时不会裁剪。 如果给出的是矩形图像,并且需要调整正方形大小(宽度=高度),则必须进行一些中心加权的裁剪。 问题答案: 您需要在调整大小之前正确裁剪图像。基本思想是确定源图像的最大矩形区域,该区域的纵横比(宽高比)与缩略图图像相同,然后在调整为缩略图尺寸之前将其周围的任何多余部分修剪(裁剪)。这是一个

  • 我已经启动并运行了AngularJS和web.api WAAD身份验证。对于客户端,我使用了很棒的库adal.js。对于后端,我使用Microsoft.OWIN.Security.OAuth。这部分进行得相当顺利。 现在我要实现基于角色的授权(将映射到WAAD组)。组不包括在身份验证令牌中,所以我必须向Azure Graph API请求它们。我看到了各种实现方法,例如使用自定义声明提供程序、向pr

  • 问题内容: 每隔几周就会弹出一个奇怪的神秘数据损坏错误,而没人知道为什么。到目前为止,表上的主键似乎是自发更改的,因此指向该表的其他行现在被弄乱了。 尽管我仍在寻找造成这种情况的根本原因(无法进行复制),但我还是希望通过某种临时手段来防止列值不断变化。这是表模式: 我们当然需要能够创建新的行,但是无论运行什么奇怪的查询,我都想防止任何更改。 我能想到的一些想法: 我对Oracle的表权限不是很熟悉