如何通过T-SQL或PowerShell从带FileStream的SQL Server取回视频文件
从SQL Server FileStream中取回视频文件(无需C#)
你可以通过T-SQL结合bcp命令或者PowerShell脚本直接取回视频文件,无需编写C#代码,具体方法如下:
方法一:T-SQL + bcp命令
bcp是SQL Server自带的命令行工具,可用于导出二进制数据。
- 先启用xp_cmdshell(若未启用):
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
- 执行导出命令(替换占位符为你的实际信息):
EXEC xp_cmdshell 'bcp "SELECT files FROM vid_index.dbo.vids WHERE id = 1" queryout "E:\recovered_video.mp4" -S YOUR_SERVER_INSTANCE -T -n'
-S:指定SQL Server实例名称(例如localhost或.\SQLEXPRESS)-T:使用Windows身份验证;如果是SQL身份验证,改用-U username -P password-n:以原生格式导出,保证二进制数据完整无损坏
方法二:PowerShell脚本
PowerShell无需启用xp_cmdshell,操作更灵活:
# 配置参数 $serverName = "YOUR_SERVER_INSTANCE" $dbName = "vid_index" $outputPath = "E:\recovered_video.mp4" $recordId = 1 # 连接数据库并读取二进制数据 $connString = "Server=$serverName;Database=$dbName;Integrated Security=True;" $conn = New-Object System.Data.SqlClient.SqlConnection($connString) $conn.Open() $cmd = New-Object System.Data.SqlClient.SqlCommand("SELECT files FROM dbo.vids WHERE id = $recordId", $conn) $reader = $cmd.ExecuteReader() if ($reader.Read()) { [System.IO.File]::WriteAllBytes($outputPath, $reader["files"]) Write-Host "视频文件已成功导出到 $outputPath" } # 清理资源 $reader.Close() $conn.Close()
运行脚本前,替换$serverName、$outputPath和$recordId为你的实际值即可。
补充说明
你用SELECT * FROM vids看到的十六进制字符串是SQL Server对varbinary(max)类型的默认显示格式,并不代表数据损坏,实际存储的是完整的视频二进制内容。
内容的提问来源于stack exchange,提问作者Rand0m _
相关产品推荐
相关产品推荐

