sql >> データベース >  >> RDS >> Sqlserver

SQLサーバーのPDFファイルに画像列をエクスポートしますか?

    私はそれをより速くする方法を見つけたので、この質問に答えています。

    コマンドラインからbcp(バルクコピープログラム)ユーティリティを使用すると、ネイティブファイル形式が保持され、非常に高速になります。出力ファイルは、ローカルディレクトリに書き込むこともできます。また、必要に応じてファイル形式をカスタマイズできます。

    編集:使用したコードを使用して、回答のより詳細なバージョンを追加します。

    1)xp_cmdshellを実行するために必要な権限を設定します 。

    EXEC sp_configure 'show advanced options', 1;  
    GO  
    RECONFIGURE;  
    GO
    EXEC sp_configure 'xp_cmdshell',1  
    GO  
    RECONFIGURE;  
    GO
    

    2)bcpを使用してテーブルのフォーマットファイルをエクスポートします

    bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt
    

    -Tを置き換えます -S servername -d databasename -U username -P passwordを使用 統合セキュリティを使用してデータベースに接続しない場合。

    3)フォーマットファイルのエクスポートが成功したら、フォーマットファイルを編集して、imageを除く他のすべての列を削除します。 またはvarbinary 列。

    フォーマットファイルは最初はこのように見えました。

    11.0
    17
    1       SQLNCHAR            2       200     ""   1     Name                                 SQL_Latin1_General_CP1_CI_AS
    2       SQLNCHAR            2       1000    ""   2     Description                          SQL_Latin1_General_CP1_CI_AS
    3       SQLUNIQUEID         1       16      ""   3     GUID                                 ""
    4       SQLBIT              1       1       ""   4     Enabled                              ""
    5       SQLNCHAR            2       600     ""   5     ClassType                            SQL_Latin1_General_CP1_CI_AS
    6       SQLINT              0       4       ""   6     PartitionID                          ""
    7       SQLBIT              1       1       ""   7     Protected                            ""
    8       SQLDATETIME         1       8       ""   8     LastModifiedTime                     ""
    9       SQLINT              0       4       ""   9     LastModifiedByID                     ""
    10      SQLINT              0       4       ""   10    ImageType                            ""
    11      SQLBIT              1       1       ""   11    Template                             ""
    12      SQLINT              0       4       ""   12    ObjectID                             ""
    13      SQLBINARY           8       0       ""   13    Image     --column of interest                           ""
    14      SQLINT              0       4       ""   14    ParentId                             ""
    15      SQLNCHAR            2       600     ""   15    ParentClassType                      SQL_Latin1_General_CP1_CI_AS
    16      SQLBIT              1       1       ""   16    IsPrimary                            ""
    17      SQLDATETIME         1       8       ""   17    ImageCaptureDate                     ""
    

    以下のようにファイルを編集しました。

    11.0
    1
    1      SQLBINARY           0       0       ""   1    Image                                ""
    

    4)次に、テーブルの行をループして、各行の画像列をファイルとして抽出する必要がありました。 temp tableを使用しました この目的のために。

    IF OBJECT_ID('dbo.tmp_for_picture', 'U') IS NOT NULL
    DROP TABLE tmp_for_picture
    GO
    select 
     row_number() over(order by parentid) as rownum 
    ,i.image as image_column
    ,i.parentid
    ,replace(p.name,',','') as picture_file_name
    ,i.name
    into tmp_for_picture
    from Images i 
    join personnel p on p.ObjectID = i.ParentId
    GO
    declare @cnt int
    declare @i int 
    declare @filename varchar(512)
    declare @extension varchar(20)
    declare @sql varchar(4000)
    set @cnt = (select count(*) from Images i join personnel p on p.ObjectID = i.ParentId)
    set @i = 1
    set @extension = '.jpeg' --or extract the extension from a column in the table if available
    
    while @i <= @cnt 
    begin
    --print @i
    set @filename = (select picture_file_name from tmp_for_picture where rownum = @i)
    set @sql = 'bcp "select image_column from tmp_for_picture where rownum = '+str(@i)+'" queryout "F:\pictures\'[email protected][email protected]+'" -f formatfile.fmt -S servername -d databasename -T'
    --print @sql
    exec xp_cmdshell @sql
    set @i = @i+1
    end
    GO
    

    上記の手順を使用して、データベースから任意のタイプの画像/ varbinaryファイル(pdf、docxなどとして保存)を抽出できます。




    1. MYSQL検索フィールドメソッド

    2. OracleForms6iでローカルディスクに保存されているPDFファイルを表示する

    3. 渡された2つの日付の間の稼働日数を返すSQL

    4. Spring 3 MVC + MySQL:€文字を保存できません