Копирование значений 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