19

データ型の列がいくつかimageあり、それらのテーブルのデータをプレビュー (または参照) したいと考えています。SQL Server Management Studio で使用するSelect top 1000 rowsと、画像列の値が 16 進数で表示されます。16 進値が役に立たないので、これらの画像をプレビューする最も簡単な方法は何ですか?

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 ユーティリティの完全なドキュメントについては、こちらを確認してください。

このプロシージャは、テーブル内のすべてをエクスポートすることも、渡された主キーに基づいて単一の行のみをエクスポートすることもできます。カーソル (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 などの種類もわかっていると思います。

本格的な proc の手間や再利用性を望まない場合は、次のような単一のクエリを試してください。


    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 でこれを実現する方法がわかりません。おそらく、データベースにクエリを実行し、16 進数を正しい画像タイプ (.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 に答える