SQL Server 2008 でバイナリ データをストアド プロシージャに渡す
-
20-09-2019 - |
質問
ファイルをデータベースに保存する方法を考え中です。ファイルをデータベースではなくファイル システムに保存することが推奨されていることはわかっていますが、私が取り組んでいる仕事では、これらの画像 (ファイル) を保存するためにデータベースを使用することを強く望んでいます。
いくつかの制約もあります。私は管理者ユーザーではないので、すべてのコマンドを実行するにはストアド プロシージャを作成する必要があります。これまでのところそれほど難しいことではありませんが、データベースにファイル (画像) を保存する方法を確立することは一生不可能です。
バルクコマンドを使用しようとすると、「バルクロードステートメントを使用する許可がない」というエラーが発生します。バルクユーティリティは、ファイルをデータベースにアップロードする簡単な方法のように思えましたが、許可がなければラウンドを使用する必要があります。
ファイルアップロード入力タイプのHTMLフォームを使用し、PHPで扱うことにしました。PHP はストアド プロシージャを呼び出し、ファイルの内容を渡します。問題は、パラメータの最大長が 128 文字までであることです。
今、私は完全に行き詰まっています。Bulk コマンドを使用する権限がありません。SP に渡すことができるパラメータの最大長は 128 文字のようです。
バイナリ文字とアスキー文字はうまく混在しないため、問題が発生するだろうと予想していましたが、行き詰まりました...
ありがとう
解決
これが私が見つけた例です デビッド・ヘイデンのブログで。
これは C# の例ですが、手順は PHP でも同様です。
- アップロードしたファイルをバイト配列に変換します
- サーバー上で動的 TSQL を実行する
他のヒント
一般的に、我々は、SQLでのバイナリデータを渡しません。私たちは、データベースにサーバからイメージをロードし、その後、サーバーにファイルをアップロードします。
ファイルからデータベースにイメージをロードします:
UPDATE images
SET image = LOAD_FILE('images/myimage.jpg')
WHERE image_id = 1234
ファイルにバックアウト画像を取得します:
SELECT image
INTO DUMPFILE 'images/myimage.jpg'
FROM images
WHERE image_id = 1234