Специальное извлечение данных из столбца SQL Server varbinary - PullRequest
6 голосов
/ 28 апреля 2010

Я хотел бы получить некоторые двоичные данные из столбца varbinary(max) в базе данных SQL Server для целей отладки.

Какой самый простой способ поместить эти данные в локальный двоичный файл, желательно без необходимости писать одноразовое консольное приложение?

Я пытался использовать SQL Server Management Studio (с опцией «результаты в файл»), но это выводит в файл двоичную строку в шестнадцатеричном формате, а не необработанные двоичные данные.

Ответы [ 3 ]

6 голосов
/ 28 апреля 2010

Я не могу придумать более простой способ сделать это, чем отбросить бит 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();
        }
    }

Этот код был протестирован с использованием столбца Users.Sid ​​(который имеет varbinaryвведите) в стандартной установке SQL Server с службами отчетов.

4 голосов
/ 05 мая 2011

Мне понравилось предложение LinqPad. Я попробовал это, и у меня был запрос, который выплевывал двоичный файл в файл в течение 10 минут. Нет VS Project, нет сборки - и теперь скрипт сохранен, и я могу вытащить его в любое время. Так круто!

Сценарий 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());
3 голосов
/ 27 июля 2014

Я нашел это решение с помощью команды 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 в ответ Робба Садлера и я почему-то предпочитаю его.

...