从SQL Server varbinary列临时检索数据

时间:2010-04-28 09:02:27

标签: sql-server varbinary

我想从SQL Server数据库的varbinary(max)列中检索一些二进制数据以进行调试。

将这些数据放入本地二进制文件的最简单方法是什么,最好不必编写丢弃的控制台应用程序?

我尝试过使用SQL Server Management Studio(带有“results to file”选项),但这会将十六进制编码的二进制字符串输出到文件中,而不是原始二进制数据。

3 个答案:

答案 0 :(得分:6)

我想不出更容易做到这一点比扔掉C#...

    static void Main(string[] args)
    {
        GetBinaryDataToFile("Server=localhost;Initial Catalog=ReportServer;Integrated Security=true", "D:\\temp.dat");
    }

    public static void GetBinaryDataToFile(string connectionString, string path)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = "SELECT Sid FROM Users WHERE UserID = '62066184-8403-494E-A571-438ABF938A4F'";
                command.CommandType = CommandType.Text;

                using (SqlDataReader dataReader = command.ExecuteReader())
                {
                    if (dataReader.Read())
                    {
                        SqlBinary sqlBinary = dataReader.GetSqlBinary(0);
                        File.WriteAllBytes(path, sqlBinary.Value);
                    }

                    dataReader.Close();
                }
            }

            connection.Close();
        }
    }

此代码已在SQL Server与Reporting Services的默认安装中使用Users.Sid​​列(varbinary类型)进行测试。

答案 1 :(得分:4)

我喜欢LinqPad的建议。我尝试了它,并有一个查询,在10分钟内将二进制文件吐出到文件。没有VS项目,没有构建 - 现在脚本已保存,我可以随时将其拉出来。好酷!

LinqPad脚本:

var g = from pd in Archives 
    where pd.ArchiveId == 123
    select pd;

var q = from p in printDocs
where p.DocumentId == g.SingleOrDefault().DocumentId
select p;

File.WriteAllBytes("C:\\temp.pdf", q.SingleOrDefault().Pdf.ToArray());

答案 2 :(得分:3)

我找到this solution bcp命令(从命令提示符运行):

c:\temp>bcp "select MYVARBINARYCOL from MYTABLE where id = 1234" queryout "c:\filename.pdf" -S MYSQLSERVER\MYINSTANCE -T

Enter the file storage type of field filedata [varbinary(max)]:
Enter prefix-length of field filedata [8]: 0
Enter length of field filedata [0]:
Enter field terminator [none]:

Do you want to save this format information in a file? [Y/n] n

Starting copy...

1 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 15 Average : (66.67 rows per sec.)

我使用-T选项使用Windows身份验证连接到数据库。如果您使用密码验证,则需要使用-U和-P开关来指定用户名和密码。

但我也喜欢LinqPad中的Robb Sadler's answer建议,并且不知何故更喜欢它。