将存储在sql Server表中的文件(blob)导出到硬盘驱动器上的文件的最快方法是什么?我有超过2.5 TB的文件(90 kb avg)存储为varbinary,我需要尽快将每个文件提取到本地硬盘. BCP似乎可以工作,但是我会看到速度超过45天,而且我担心我的脚本会在某些时候失败,因为Management Studio会耗尽内存.
解决方法
我尝试使用CLR功能,它的速度是BCP的两倍多.这是我的代码.
原始方法:
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)
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; } } } }