SQL Server Management Studioを使用してデータベースにBLOBを挿入する方法
-
10-07-2019 - |
質問
ブロブをvarbinary(MAX)
フィールドに簡単に挿入するにはどうすればよいですか?
例:
挿入するもの:c:\ picture.png
テーブルはmytable
列はmypictureblob
です
場所はrecid = 1です
解決
SQL Server Management Studio内のT-SQLを使用して、特にOPENROWSETコマンドを使用して、varbinary(max)フィールドに挿入できます。
例:
INSERT Production.ProductPhoto
(
ThumbnailPhoto,
ThumbnailPhotoFilePath,
LargePhoto,
LargePhotoFilePath
)
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
FROM OPENROWSET
(BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto
良い例/チュートリアルについては、次のドキュメントをご覧ください
この場合のファイルパスは、このコマンドを実行しているクライアントではなく、ターゲットのSQLサーバーに相対的であることに注意してください。
他のヒント
MSDNには記事大きな値の種類の使用に関する記事があります。 、 インポートパーツがどのように機能するかを説明しようとしますが、同時に2つのことを行うため、少し混乱する可能性があります。
ここでは、2つの部分に分かれた簡易バージョンを提供しています。次の簡単な表を想定してください:
CREATE TABLE [Thumbnail](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Data] [varbinary](max) NULL
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED
(
[Id] ASC
) ) ON [PRIMARY]
実行する場合(SSMSで):
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
結果は、BulkColumn
という名前の1つの列を持つテーブルのように見えることを示します。そのため、INSERTで次のように使用できます。
INSERT [Thumbnail] ( Data )
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
残りは、テーブルに含まれる列と含まれない列を含む挿入にそれを適合させるだけです。そのselect FOO
の結果に名前を付けると、テーブルの他のフィールドにその定数の後にSELECT Foo.BulkColumn
およびas
を使用できます。
さらに注意を要するのは、そのデータをファイルにエクスポートして、問題がないことを確認する方法です。 cmd行で実行する場合:
bcp "select Data from B2B.dbo.Thumbnail where Id=1"
queryout D:\T\TestImage1_out2.dds -T -L 1
さらに4つの<!> quot; params <!> quot;が鳴り始めます。そして、誤解を招くようなデフォルトを与えます(これにより、ファイルが変更されます)。最初のものを受け入れ、2番目を0に設定してから3番目と4番目に設定するか、明示的にすることができます:
フィールドデータのファイルストレージタイプを入力[varbinary(max)]:
フィールドデータのプレフィックス長を入力してください[8]:0
フィールドデータの長さを入力してください[0]:
フィールドターミネータを入力[なし]:
次の質問が表示されます。
この形式情報をファイルに保存しますか? [Y / n] y
ホストファイル名[bcp.fmt]:C:\ Test \ bcp_2.fmt
次に実行する必要があるときは、-f C:\Test\bcp_2.fmt
を追加し、泣き言を停止します:-)
時間と悲しみを大幅に節約します。
TSQLでBLOBを選択する方法は2つあります:
SELECT * FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
同様:
SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
FROM句の後の相関名に注意してください。これは必須です。
INSERT SELECTを実行して、INSERTを実行できます。
ただし、SQLサーバーマシン上のディスクからファイルを簡単に読み取ることができます。
select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a
管理アプリケーションで16進形式で表示するには(Management Studio)。
そのため、たとえば、データベースにファイルを(サーバー上でローカルに)バックアップし、上記のステートメントで他の場所にダウンロードできます。
mgmt studioから行う必要がありますか? cmd行から行う方法は次のとおりです。
<!> quot; C:\ Program Files \ Microsoft SQL Server \ MSSQL \ Binn \ TEXTCOPY.exe <!> quot; / S <!> lt;サーバー<!> gt; / D <!> lt;データベース<!> gt; / T mytable / C mypictureblob / F <!> quot; C:\ picture.png <!> quot; / W <!> quot; where RecId = <!> quot; / I
わかりました...これには時間がかかりすぎました。 sql-management studioツールは、このような単純なものだけではありません(クエリのタイムアウトを設定する場所を探しているときに以前に気づき、4つの異なる場所で行われました)
他のsqlエディターパッケージ(私の場合はsql maestro)をダウンロードしました。また、Blobを確認してこれらのフィールドに新しいBlobをロードできるBlobエディターが含まれているのを見てください。
入力ありがとう!