Копирование значений BLOB между базами данных с использованием чистого SQL в SQL Server

Мне нужно извлечь некоторые BLOB-данные из базы данных SQL Server 2005 и сгенерировать сценарий SQL для вставки этих же данных в другую базу данных, на другой сервер.

Мне разрешено делать это только с помощью сценариев SQL, я не могу использовать любую другую утилиту или написать программу на Java или.NET для этого.

Другое большое ограничение, которое у меня есть, заключается в том, что у меня нет доступа к исходной базе данных (где находятся исходные данные BLOB), когда я запускаю сценарий, чтобы скопировать данные BLOB в целевую базу данных, поэтому данные уже должны быть закодированы в файл сценария SQL.

Подводя итог: есть ли способ кодировать данные BLOB в текст, чтобы я мог вывести их в команду SQL INSERT в текстовом файле сценария и запустить?

Я могу запускать специальные операторы T-SQL и хранимые процедуры, если это необходимо.

3 ответа

Решение

TEXTCOPY был примером приложения, включенного в SQL Server 7.0 и 2000, но больше не доступного в SQL Server 2005.

Тем не менее, прибегая к поиску TEXTCOPY в SQL Server 2005, я нашел эту альтернативу, которая может помочь:

http://sequelserver.blogspot.com/2007/01/texcopy-sql-server-2005.html

Он основан на записи и чтении двоичных данных из файловой системы, что в моем случае не идеально (в идеале я хотел бы кодировать двоичные данные с помощью самого текстового файла сценария SQL), но это лучшее, что я нашел до сих пор.

Вот еще один хороший источник информации о том, как выполнять двоичные операции импорта / экспорта с помощью BULK OPENROWSET: http://msdn.microsoft.com/en-us/library/ms191184.aspx

Эта статья " Копирование текста или изображения в SQL Server или из него " может помочь:

Вы можете интегрировать инструмент командной строки TEXTCOPY в хранимую процедуру:

CREATE PROCEDURE sp_textcopy (
  @srvname     varchar (30),
  @login       varchar (30),
  @password    varchar (30),
  @dbname      varchar (30),
  @tbname      varchar (30),
  @colname     varchar (30),
  @filename    varchar (30),
  @whereclause varchar (40),
  @direction   char(1))

AS

DECLARE @exec_str varchar (255)
SELECT @exec_str =
         'textcopy /S ' + @srvname +
         ' /U ' + @login +
         ' /P ' + @password +
         ' /D ' + @dbname +
         ' /T ' + @tbname +
         ' /C ' + @colname +
         ' /W "' + @whereclause +
         '" /F ' + @filename +
         ' /' + @direction
EXEC master..xp_cmdshell @exec_str

Вам нужно будет немного изменить / расширить его, чтобы прочитать созданный файл в другую базу данных.

Как пишет Vinko Vrsalovic в комментарии к этому ответу, имейте в виду, что для этого необходимо включить xp_cmdshell в конфигурации поверхности.

Описание ТЕКСТОПИИ:

Копирует одно значение текста или изображения в SQL Server или из него. Значением является указанный текст или изображение "столбец" из одной строки (указанной "предложением where") указанной "таблицы".

Если направление IN (/I), то данные из указанного "файла" копируются в SQL Server, заменяя существующее значение текста или изображения. Если направление OUT (/O), то значение текста или изображения копируется из SQL Server в указанный "файл", заменяя любой существующий файл.

Взгляните на этот вопрос и найдите bcp на странице - здесь есть пример как импорта, так и экспорта для varbinary(max) (который является новым стандартным типом для таких столбцов). Вы можете запустить произвольный запрос на экспорт.

Как вставить BLOB-объект в базу данных с помощью SQL Server Studio Studio

Другие вопросы по тегам