【问题标题】:Export file stored in SQL table by saving file hash into local file通过将文件哈希保存到本地文件来导出存储在 SQL 表中的文件
【发布时间】:2021-09-29 19:48:57
【问题描述】:

首先让我说我对 SQL 知之甚少 - 我可以进入 SQL Server Management Studio 并查看我的数据库、表、列等。我可以运行查询来验证数据是否存在。

我们最近退出了 SaaS 产品并收到了我们的数据数据库,然后将其安装在本地 SQL Server 上。除了附加到记录的文件之外,我可以获得所需的数据。

有一个文件存储为哈希表(如果我的术语有点扭曲,请不要笑),供应商建议我们可以“从 SSMS 中的 SQL 中提取附件。你应该能够将 SQL 中的文件哈希保存到带有扩展名的新文件中以使其打开。”。

我不需要提取所有文件,我只需要能够在需要时提取它们以用于特定记录,一次一个。我看到一个处理 MySQL 的东西叫做 Dump File,这似乎是我需要的那种路径——能够运行一个调用特定记录并将其保存到本地文件中的查询。然后我会手动更改文件扩展名。

有没有半简单的方法来做到这一点?我需要提供任何其他信息吗?感谢您的帮助。

【问题讨论】:

  • 我们至少需要查看表定义。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: sql-server file hash ssms


【解决方案1】:

假设完整文件位于 SQL Server varbinary(max)image 列中,您可以通过运行 PowerShell 脚本将其提取到本地文件中。网上有很多例子,比如here,其要点是:

$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)            
            
# Looping 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();            
}      

【讨论】:

  • 感谢您提供的信息。表结构确实使用了 varbinary (max)。 - RecID (varchar(42) - CreatedDateTime (datetime) - AttachType (varchar(10)) - AttachFlags (varchar(200)) - FilePath (varchar(500)) - FileContents (varbinary(max)) - FileExt (varchar(10) )) - LastModTimeStamp (timestamp) 我很欣赏这段代码,并会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多