Copiando valores BLOB entre bancos de dados com SQL puro no SQL Server
-
07-07-2019 - |
Pergunta
Eu preciso puxar alguns dados BLOB de um banco de dados SQL Server 2005 e gerar um script SQL para inserir estes mesmos dados em outro banco de dados, em outro servidor.
Eu só estou autorizado a fazer isso usando scripts SQL, eu não posso usar qualquer outro utilitário ou escrever um programa em Java ou .NET para fazê-lo.
A outra grande restrição que tenho é que eu não tenho acesso ao banco de dados original (onde os dados BLOB original está) quando eu executar o script, para copiar os dados BLOB ao banco de dados alvo, de modo que os dados já deve ser codificados dentro do arquivo script SQL.
Resumindo: existe uma maneira de codificar os dados BLOB em texto para que eu possa despejá-lo em um comando SQL INSERT dentro de um arquivo de texto de script e executá-lo
?Eu sou capaz de executar instruções T-SQL especiais e procedimentos armazenados, se necessário.
Solução
TEXTCOPY foi um aplicativo de exemplo incluído no SQL Server 7.0 e 2000, mas não está mais disponível no SQL Server 2005.
No entanto, pesquisando para TEXTCOPY no SQL Server 2005, achei que esta alternativa que pode fazer o truque:
http://sequelserver.blogspot.com/2007 /01/texcopy-sql-server-2005.html
Ele se baseia em escrever e ler os dados binários do sistema de arquivos, que no meu caso não é o ideal (o ideal é que eu gostaria de codificar os dados binários com o próprio arquivo de texto script SQL), mas é o melhor que eu encontrei até agora.
Aqui é outra boa fonte sobre como fazer operações binárias de importação / exportação usando BULK OPENROWSET: http://msdn.microsoft.com/en-us/library/ms191184. aspx
Outras dicas
Este artigo " Copiar texto ou imagem dentro ou fora do SQL Server " poderia ajudar:
Você poderia integrar a ferramenta de linha de comando TEXTCOPY em um procedimento armazenado:
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
Você vai ter que mudar / estendê-lo um pouco, a fim de ler o arquivo criado em outro banco de dados.
Como Vinko escreve no comentário a esta resposta, espera-se que esta exige permitindo xp_cmdshell na superfície área de configuração.
Descrição do TEXTCOPY:
Copia um único valor de texto ou uma imagem dentro ou fora do SQL Server. O valor que é um texto especificado ou a imagem 'coluna' de uma única linha (especificado pelo "Cláusula where") da 'mesa' especificado.
Se a direção é IN (/ I), em seguida, os dados do 'arquivo' especificado é copiado para SQL Server, substituindo o valor de texto ou imagem existente. Se o direção é OUT (E / S), então o valor de texto ou imagem é copiado de SQL Server para o 'arquivo' especificado, substituindo qualquer arquivo existente.
Dê uma olhada esta questão e procurar bcp na página - tem exemplo de importação e exportação para varbinary (max) (que é o novo tipo de padrão para tais colunas). você pode executar a consulta arbitrária para exportação.
Como inserir uma bolha em um banco de dados usando o estúdio de gerenciamento sql server