SQL Server テーブルに保存されているファイル (BLOB) をハード ドライブ上のファイルにエクスポートする最も速い方法は何ですか? 2.5 TB を超えるファイル (平均 90 kb) を varbinary として保存しており、各ファイルをできるだけ早くローカル ハード ドライブに展開する必要があります。BCP は機能しているようですが、私が見ている速度では 45 日以上かかります。また、Management Studio がメモリ不足になるため、ある時点でスクリプトが失敗するのではないかと心配しています。
129683 次
3 に答える
36
CLR 関数を使ってみたところ、BCP の 2 倍以上の速さでした。これが私のコードです。
元の方法:
SET @bcpCommand = 'bcp "SELECT blobcolumn FROM blobtable WHERE ID = ' + CAST(@FileID AS VARCHAR(20)) + '" queryout "' + @FileName + '" -T -c'
EXEC master..xp_cmdshell @bcpCommand
CLR メソッド:
declare @file varbinary(max) = (select blobcolumn from blobtable WHERE ID = @fileid)
declare @filepath nvarchar(4000) = N'c:\temp\' + @FileName
SELECT Master.dbo.WriteToFile(@file, @filepath, 0)
CLR 関数の C# コード
using System;
using System.Data;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;
namespace BlobExport
{
public class Functions
{
[SqlFunction]
public static SqlString WriteToFile(SqlBytes binary, SqlString path, SqlBoolean append)
{
try
{
if (!binary.IsNull && !path.IsNull && !append.IsNull)
{
var dir = Path.GetDirectoryName(path.Value);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
using (var fs = new FileStream(path.Value, append ? FileMode.Append : FileMode.OpenOrCreate))
{
byte[] byteArr = binary.Value;
for (int i = 0; i < byteArr.Length; i++)
{
fs.WriteByte(byteArr[i]);
};
}
return "SUCCESS";
}
else
"NULL INPUT";
}
catch (Exception ex)
{
return ex.Message;
}
}
}
}
于 2012-04-27T17:54:06.783 に答える