web-dev-qa-db-ja.com

SQL Server Management Studioを使用してデータベースにブロブを挿入する方法

varbinary(MAX)フィールドにblobを簡単に挿入するにはどうすればよいですか?

例として:

私が挿入したいものは:c:\ picture.png
テーブルはmytable
列はmypictureblobです
場所はrecid = 1です

48
Toad

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サーバーに対する相対パスであることに注意してください。

64
John Sansom

MSDNには Working With Large Value Types という記事があります。これは、インポートパーツがどのように機能するかを説明しようとしますが、同時に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.BulkColumnasを使用できます。

さらに注意が必要なのは、そのデータをファイルにエクスポートして、問題がないことを確認する方法です。 cmd行で実行する場合:

bcp "select Data from B2B.dbo.Thumbnail where Id=1" 
queryout D:\T\TestImage1_out2.dds -T -L 1 

追加の4つの「パラメーター」が必要になり、誤解を招くようなデフォルト値が与えられます(これによりファイルが変更されます)。最初のものを受け入れ、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を追加すると、泣き言が止まります:-)時間と悲しみを大幅に節約します。

15
ZXX

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を実行できます。

TSQLを使用してSQL SERVERでBLOBを更新する方法 で説明したように、2番目のバージョンを使用してUPDATEを実行することもできます。

8
yoel halb

ただし、SQLサーバーマシンのディスクからファイルを簡単に読み取ることができます。

select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a

16進形式の管理アプリケーション(Management Studio)で表示します。

そのため、たとえば、データベースをファイルに(サーバー上でローカルに)バックアップし、上記のステートメントで他の場所にダウンロードできます。

2
pbies

Mgmt studioから行う必要がありますか? cmd行から行う方法は次のとおりです。

"C:\ Program Files\Microsoft SQL Server\MSSQL\Binn\TEXTCOPY.exe"/S <サーバー>/D <データベース>/T mytable/C mypictureblob/F "C:\ picture.png"/W "where RecId = "/ I

1
cagreen

わかりました...これには時間がかかりすぎました。 sql-management studioツールは、このような単純なものにとどまりません(クエリのタイムアウトを設定する場所を探すときに以前気づいたことがあり、4つの異なる場所で行われました)

他のsqlエディターパッケージ(私の場合はsql maestro)をダウンロードしました。また、Blobを確認し、これらのフィールドに新しいBlobを読み込むことができるBlobエディターが含まれています。

入力をありがとう!

0
Toad