sql – 将表中的blob导出到单个文件的最快方法
发布时间:2020-07-09 02:07:47 所属栏目:MsSql 来源:互联网
导读:将存储在SQL Server表中的文件(blob)导出到硬盘驱动器上的文件的最快方法是什么?我有超过2.5 TB的文件(90 kb avg)存储为varbinary,我需要尽快将每个文件提取到本地硬盘. BCP似乎可以工作,但是我会看到速度超过45天,而且我担心我的脚本会在某些时候失败,因为M
|
将存储在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) 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;
}
}
}
} (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
