画像列をSQL Serverのファイルにエクスポートする方法は?


13

データベースから移行します。imageファイルシステム上のバイナリファイルにエクスポートしたいタイプの列が1つあります。レコードごとに1つのファイル。SQL Serverでこれを行うにはどうすればよいですか?


1
Amnaアシフによって良いポストsqlcache.blogspot.com/2014/09/...
aasim.abdullah

1
私はおそらくして、単純なSSISのデータフローをノックしたいエクスポート列変換
マーティン・スミス

回答:


13

これは私が思いついた解決策です:

  1. 有効xp_cmdshell

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. 必要に応じてxp_cmdshell、必要な権限を取得するためのディレクトリを作成します。

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. queryoutでBCPを使用する

    EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -N'

** your_dbは完全修飾テーブル名、つまり[Yourdb]。[YourSchema]。[YourTable]でなければなりません


1
上記のコードを試してみましたが、実際に動作しました...ある程度まで。何らかの理由で、JPGイメージには4つの先行文字が含まれているため、無効になります。これらをテキストエディターで削除し、出来上がりました... JPGは機能しました。これらの4つのキャラクターが何であり、エクスポートでそれらを取り除く方法はありますか?それらは:2B 90 01 00

エクスポート元の列のタイプは何ですか?
マックスヴァーノン

10

同様に、すべてのファイルの先頭に追加の4バイトが追加されるという問題がありました。bcpコマンドで-Nオプションを使用する代わりに、-C RAWに変更しました。これを行うと、bcpに次の質問が表示されます。

フィールドFileData [image]のファイルストレージタイプを入力します。
フィールドFileData [4]のプレフィックス長を入力します。
フィールドFileData [0]の長さを入力してください:
フィールドターミネータを入力[なし]: 
この形式情報をファイルに保存しますか?[Y / n]

これを修正するために、SQLサーバーのルートにテキストファイル(i.txt)を作成しました。このファイルには、これらのそれぞれに答える次の行が含まれています。

私
0
0

n

次に、EXEC bcp行が次のようになりました。

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db WHERE id = 1" queryout "C:\ exportdir \ yourfile.pdf" -T -C RAW <C:\ i.txt'

これにより、余分な文字を一切含まないファイルがエクスポートされました。


2

さまざまな種類のファイル(pdf、xls、doc、xmlなど)が保存されているIMAGE列をエクスポートするソリューションを探していました。

回答のアプローチは、pdfファイルに対してのみ有効でした。あらゆる種類のファイルをエクスポートするには、次のようにソリューションを調整する必要がありました。

(1.)フォーマットテンプレートファイルを作成します。

Declare @sql varchar(500); 
Declare @sql varchar(500); 
SET @sql = 'bcp db.dbo.ImgTable format nul -T -n -f C:\tmp\export.fmt -S ' + @@SERVERNAME; 
select @sql;  
EXEC master.dbo.xp_CmdShell @sql; 

(2.)作成されたエクスポート形式ファイルを開き、そのように編集します:

10.0
1
1       SQLIMAGE            0       0       ""   1     img_col                                     ""

次に、エクスポートコマンドを実行します。

EXEC master..xp_cmdshell 'BCP "SELECT IMG_COL FROM db.dbo.ImgTable WHERE id = ''CAB240C0-0068-4041-AA34-0000ECB42DDD'' " queryout "C:\tmp\myFile.xml" -T -f C:\tmp\export.fmt -S '

(3.)このエラーに遭遇した場合(私がしたように):

「[Microsoft] [SQL Native Client] Host-file列は、サーバーにコピーするときのみスキップできます」

以下を確認してください。

  • 2行目の編集を忘れずに、ここにエントリ数(このシナリオでは1)を入力してください。
  • 最後の行の最後にCRLFがあることを確認してください。これがないと動作しませんでした!

この後、エラーなしでIMAGE列ファイルの単語をエクスポートします。

1.および2.のオマージュは、すべて次の質問の答えに進みます。https : //stackoverflow.com/questions/1366544/how-to-export-image-field-to-file/24006947#24006947


1

GUIソリューションに問題がない場合、SSMS SSMSBoost用の本当に素晴らしいアドインがあり、多くの便利な機能を提供します。もちろん、SQLに保存されている画像をプレビューする最も簡単な方法です(少なくとも私の意見では)

:このアドインをインストールした後、SSMSを再起動する必要があります。

それをインストールして、右クリックで画像のプレビューをお楽しみください:右クリック>視覚化>画像


0
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'

コマンドを1行で保持する-シングルライン!!!

SET @Command = 'bcp "SELECT Member_Picture FROM dbserver.[Member_Image] WHERE memberId = 1 " queryout "D:\Project\Member\Images\member1.jpg" -T -N ' 
PRINT @Command -- debugging
EXEC xp_cmdshell   @Command
GO

一部のサーバーではxp_cmdshellが無効になり、次のようになりますSQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.
JustAMartin

-2
USE [POC]
DECLARE @outPutPath varchar(50) = 'C:\Extract_Photos'
, @i bigint
, @init int
, @data varbinary(max)
, @fPath varchar(max)
, @folderPath  varchar(max)

--Get Data into temp Table variable so that we can iterate over it
DECLARE @Doctable TABLE (id int identity(1,1), [Doc_Num]  varchar(100) , [FileName]  varchar(100), [Doc_Content] varBinary(max) )

INSERT INTO @Doctable([Doc_Num] , [FileName],[Doc_Content])
Select [STUDENTNO] , [STUDENTNAME],[STUDENTPHOTO] FROM  [dbo].[STUDENTPHOTOS]

--SELECT * FROM @table

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN

    SELECT
     @data = [Doc_Content],
     @fPath = @outPutPath + '\'+ [Doc_Num] + '\' +[FileName],
     @folderPath = @outPutPath + '\'+ [Doc_Num]
    FROM @Doctable WHERE id = @i

  --Create folder first
  EXEC  [dbo].[CreateFolder]  @folderPath

  EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
  EXEC sp_OASetProperty @init, 'Type', 1;
  EXEC sp_OAMethod @init, 'Open'; -- Calling a method
  EXEC sp_OAMethod @init, 'Write', NULL, @data; -- Calling a method
  EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; -- Calling a method
  EXEC sp_OAMethod @init, 'Close'; -- Calling a method
  EXEC sp_OADestroy @init; -- Closed the resources

  print 'Document Generated at - '+  @fPath

--Reset the variables for next use
SELECT @data = NULL
, @init = NULL
, @fPath = NULL
, @folderPath = NULL
SET @i -= 1
END

このコードの動作を説明して、投稿を修正してください。
dezso

それが素晴らしく機能したスクリプトを提供してくれたエラックスに感謝します。PS:SSMSを使用してリモートで実行した場合、スクリプトはファイルの抽出に失敗します。添付ファイルを取得するには、SQLServerで直接実行する必要がありました。
-Vaas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.