SQL Serverの純粋なSQLを使用したデータベース間でのBLOB値のコピー
-
07-07-2019 - |
質問
SQL Server 2005データベースからいくつかのBLOBデータを取得し、この同じデータを別のデータベースの別のサーバーに挿入するSQLスクリプトを生成する必要があります。
SQLスクリプトを使用してのみこれを行うことができます。他のユーティリティを使用したり、Javaや.NETでプログラムを記述したりすることはできません。
もう1つの大きな制限は、スクリプトを実行してBLOBデータをターゲットデータベースにコピーするときに、元のデータベース(元のBLOBデータがある)にアクセスできないことです。 SQLスクリプトファイル内でエンコードされます。
まとめ:BLOBデータをテキストにエンコードして、スクリプトテキストファイル内のSQL INSERTコマンドにダンプして実行できるようにする方法はありますか?
必要に応じて、特別なT-SQLステートメントとストアドプロシージャを実行できます。
解決
TEXTCOPYは、SQL Server 7.0および2000に含まれていたサンプルアプリケーションでしたが、SQL Server 2005では使用できなくなりました。
ただし、SQL Server 2005のTEXTCOPYをグーグルで検索すると、トリックを実行する可能性のあるこの代替手段が見つかりました。
http://sequelserver.blogspot.com/2007 /01/texcopy-sql-server-2005.html
ファイルシステムからのバイナリデータの書き込みと読み取りに依存していますが、これは私の場合は理想的ではありません(理想的にはSQLスクリプトテキストファイル自体でバイナリデータをエンコードしたいです)が、私が見つけた最高のものですこれまでのところ。
ここに、BULK OPENROWSETを使用してバイナリインポート/エクスポート操作を行う方法に関する別の優れた情報源があります。 http://msdn.microsoft.com/en-us/library/ms191184。 aspx
他のヒント
この記事" テキストまたは画像をSQL ServerにコピーまたはSQL Serverからコピー"助けることができます:
ストアドプロシージャにTEXTCOPYコマンドラインツールを統合できます。
CREATE PROCEDURE sp_textcopy (
@srvname varchar (30),
@login varchar (30),
@password varchar (30),
@dbname varchar (30),
@tbname varchar (30),
@colname varchar (30),
@filename varchar (30),
@whereclause varchar (40),
@direction char(1))
AS
DECLARE @exec_str varchar (255)
SELECT @exec_str =
'textcopy /S ' + @srvname +
' /U ' + @login +
' /P ' + @password +
' /D ' + @dbname +
' /T ' + @tbname +
' /C ' + @colname +
' /W "' + @whereclause +
'" /F ' + @filename +
' /' + @direction
EXEC master..xp_cmdshell @exec_str
作成したファイルを他のデータベースに読み込むには、少し変更/拡張する必要があります。
Vinko がこの回答へのコメントに書いているように、これには表面でxp_cmdshellを有効にする必要があることに注意してくださいエリア構成。
TEXTCOPYの説明:
単一のテキストまたは画像の値をSQL Serverにコピーしたり、SQL Serverからコピーしたりします。値 単一行の指定されたテキストまたは画像「列」( " where句")指定された「テーブル」。
方向がIN(/ I)の場合、指定された「ファイル」からのデータは SQL Serverにコピーされ、既存のテキストまたは画像の値が置き換えられます。もし 方向がOUT(/ O)の場合、テキストまたは画像の値がコピーされます SQL Serverを指定された「ファイル」に追加し、既存のファイルを置き換えます。
この質問を見て、ページでbcpを検索します-varbinary(max)(このような列の新しい標準型)のインポートとエクスポートの両方の例があります。エクスポートのために任意のクエリを実行できます。