データ型の列がいくつかimage
あり、それらのテーブルのデータをプレビュー (または参照) したいと考えています。SQL Server Management Studio で使用するSelect top 1000 rows
と、画像列の値が 16 進数で表示されます。16 進値が役に立たないので、これらの画像をプレビューする最も簡単な方法は何ですか?
PS .: データベースは私の管理下にないため、データ型を変更することはできません。
データ型の列がいくつかimage
あり、それらのテーブルのデータをプレビュー (または参照) したいと考えています。SQL Server Management Studio で使用するSelect top 1000 rows
と、画像列の値が 16 進数で表示されます。16 進値が役に立たないので、これらの画像をプレビューする最も簡単な方法は何ですか?
PS .: データベースは私の管理下にないため、データ型を変更することはできません。
LinqPadがインストールされている場合、画像のプレビューは簡単です。レコードをクエリし、バイナリ データを画像に変換してから、出力をプレビュー ウィンドウにダンプします。
編集: ご存じないかもしれませんが、LinqPad は、管理スタジオの代替など、さまざまな用途に使用できる無料のユーティリティです。ほとんどの場合、使い捨てプログラム、テスト コード、およびサンプル用の .Net のスクラッチ パッドとして使用します。
var entity = // fetch data
using (var ms = new MemoryStream(entity.Image.ToArray()))
{
System.Drawing.Image.FromStream(ms).Dump();
}
結果は次のようになります。
バイナリをファイル システムにエクスポートするための 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
画像タイプは画像を保存するためのものではなく、単なる「可変長バイナリ データ」です。この型は非推奨であり、可変長のバイナリ データには varbinary(max) を使用する必要があります。
SQL Server は格納されているバイナリ データの種類 (.zip、.exe、.jpg、.anything) を認識していないため、Management Studio がプレビューを提供しないのは当然のことです。
これらのデータ型を Managment Studio でプレビューすることは絶対にできませんが、@RTomas が提供するソリューションが気に入っています。
SSMS SSMSBoostには非常に優れたアドインがあり、多くの便利な機能を提供します。もちろん、SQL に保存された画像をプレビューする最も簡単な方法です (少なくとも私の意見では)。
注: このアドインをインストールした後、SSMS を再起動する必要があります。
インストールして、次のように画像のプレビューをお楽しみください:右クリック > 視覚化 > 画像
Management Studio でこれを実現する方法がわかりません。おそらく、データベースにクエリを実行し、16 進数を正しい画像タイプ (.jpg、.png など) に変換できる単純なアプリケーションを作成するサーバーの方が優れているでしょう。これを行う商用アプリケーションもあります。