我一直在研究一種將 blob 列自動提取到檔案的方法,本博客詳細介紹了幾種方法。
通過 BCP,可以非常快速地從我的資料庫中提取較大的檔案。我能夠在 20 秒內提取一個 2 GB 的檔案。這是我使用的示例命令列,基于博客中的示例:
BCP "SELECT PictureData FROM BLOB_Test.dbo.PicturesTest " QUERYOUT C:\BLOBTest\BlobOut\WC.jpg -T -f "C:\BLOBTest\FormatFile\BLOB.fmt" -S <ServerName>\<InstanceName>
順便說一句,我必須學習如何應用格式檔案來防止將前綴字串插入到檔案中。此格式檔案必須采用 BCP 的舊格式,因為格式檔案的較新 XML 版本具有“PREFIX_LENGTH”的架構條目,可防止出現 0 值。
我更愿意使用 PowerShell 來提取 blob,但以下基于TechNet 文章的代碼需要大約兩天的時間來處理,而不是 BCP 為相同的 2 gig blob 處理 20 秒。
## https://social.technet.microsoft.com/wiki/contents/articles/890.export-sql-server-blob-data-with-powershell.aspx
## Export of "larger" SQL Server blob to file with GetBytes-Stream
# Configuration data
$Server = ".\<Instance>"; # SQL Server Instance
$Database = "Blob_Test"; # Name of database
$Dest = "C:\BLOBTest\BLOBOut\"; # Path to export to
$bufferSize = 8192; # Stream buffer size in bytes
# Select-Statement for name & blob with filter
$Sql = "Select
[PictureName],
[PictureData]
From
dbo.PicturesTest";
# Open ADO.NET Connection
$con = New-Object Data.SqlClient.SqlConnection;
$con.ConnectionString = "Data Source=$Server;"
"Integrated Security=True;"
"Initial Catalog=$Database";
$con.Open();
# New Command and Reader
$cmd = New-Object Data.SqlClient.SqlCommand $Sql, $con;
$rd = $cmd.ExecuteReader();
# Create a byte array for the stream
$out = [array]::CreateInstance('Byte', $bufferSize)
# Loop through records
While ($rd.Read()) {
Write-Output ("Exporting: {0}" -f $rd.GetString(0));
# New BinaryWriter
$fs = New-Object System.IO.FileStream ($Dest $rd.GetString(0)), Create, Write;
$bw = New-Object System.IO.BinaryWriter $fs;
$start = 0;
# Read first byte stream
$received = $rd.GetBytes(1, $start, $out, 0, $bufferSize - 1);
While ($received -gt 0) {
$bw.Write($out, 0, $received);
$bw.Flush();
$start = $received;
# Read next byte stream
$received = $rd.GetBytes(1, $start, $out, 0, $bufferSize - 1);
}
$bw.Close();
$fs.Close();
}
# Closing & disposing all objects
$fs.Dispose();
$rd.Close();
$cmd.Dispose();
$con.Close();
Write-Output ("Finished");
它最終完成了,但我不知道為什么腳本需要這么長時間才能完成。
有誰知道為什么 PowerShell 腳本被絕育了?
uj5u.com熱心網友回復:
您根本不需要 BinaryWriter。該類僅用于以 .NET 特定格式撰寫原始型別,如整數、雙精度數、字串等。它很少使用。
如果要將位元組寫入檔案,則只需使用Stream.Write:
$fs.Write $received
一個可以消除幾乎所有代碼的更好的想法是使用DbDataReader.GetStream而不是GetBytes將 BLOB 作為流讀取。之后,您可以使用Stream.CopyTo將流的內容寫入另一個流:
$dbFs=$rd.GetStream(1);
$dbFs.CopyTo($fs);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316433.html
標籤:sql-server 电源外壳 斑点 bcp
