Специальное извлечение данных из столбца varbinary SQL Server

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

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

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


person Daniel Fortunov    schedule 28.04.2010    source источник
comment
Я не уверен, что это то, что вы искали, но знаете ли вы о LINQPad? По сути, это приложение, в котором вы можете писать одноразовые приложения C#.   -  person Deniz Dogan    schedule 28.04.2010


Ответы (3)


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

person Mahmood Dehghan    schedule 27.07.2014

Я не могу придумать более простой способ сделать это, чем выбросить бит С#...

    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 со службами Reporting Services.

person Daniel Renshaw    schedule 28.04.2010

Мне понравилось предложение 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());
person Robb Sadler    schedule 05.05.2011
comment
Я не понимаю. Как это работает в LinqPad? Где определяется «Архивы»? Вы ссылаетесь на какие-то внешние библиотеки, в которых определены ваши сущности Linq-to-SQL/EntityFramework? - person Daniel Fortunov; 07.06.2011
comment
Я подключился к своей базе данных, и LinqPad автоматически создал класс данных Linq to Sql. Тогда я мог получить к нему доступ и использовать его. Это часть того, что делает его крутым. Это быстрая загрузка - я рекомендую попробовать. Это был единственный код, который я написал. - person Robb Sadler; 10.06.2011
comment
@DanielFortunov См. пошаговую инструкцию, написанную Atron Seige, в stackoverflow.com/questions/4056050/ - person Tony; 07.01.2020