sql – 将表中的blob导出到单个文件的最快方法

前端之家收集整理的这篇文章主要介绍了sql – 将表中的blob导出到单个文件的最快方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
将存储在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;
        }
      }
    }
}
原文链接:https://www.f2er.com/mssql/83739.html

猜你在找的MsSQL相关文章