Copia dei valori BLOB tra database con SQL puro in SQL Server
-
07-07-2019 - |
Domanda
Devo estrarre alcuni dati BLOB da un database SQL Server 2005 e generare uno script SQL per inserire questi stessi dati in un altro database, in un altro server.
Mi è permesso farlo solo usando script SQL, non posso usare nessun'altra utility o scrivere un programma in Java o .NET per farlo.
L'altra grande restrizione che ho è che non ho accesso al database originale (dove si trovano i dati BLOB originali) quando eseguo lo script, per copiare i dati BLOB nel database di destinazione, quindi i dati dovrebbero già essere codificato nel file di script SQL.
Riassumendo: c'è un modo per codificare i dati BLOB in testo in modo da poterli scaricare in un comando SQL INSERT all'interno di un file di testo di script ed eseguirlo?
Sono in grado di eseguire istruzioni T-SQL speciali e procedure memorizzate, se necessario.
Soluzione
TEXTCOPY era un'applicazione di esempio inclusa in SQL Server 7.0 e 2000 ma non più disponibile in SQL Server 2005.
Tuttavia, cercando su Google TEXTCOPY in SQL Server 2005, ho trovato questa alternativa che potrebbe fare il trucco:
http://sequelserver.blogspot.com/2007 /01/texcopy-sql-server-2005.html
Si basa sulla scrittura e la lettura dei dati binari dal filesystem, che nel mio caso non è l'ideale (idealmente vorrei codificare i dati binari con il file di testo dello script SQL stesso), ma è il migliore che ho trovato finora.
Ecco un'altra buona fonte su come eseguire operazioni binarie di importazione / esportazione usando BULK OPENROWSET: http://msdn.microsoft.com/en-us/library/ms191184. aspx
Altri suggerimenti
Questo articolo " Copia testo o immagine dentro o fuori SQL Server " potrebbe aiutare:
È possibile integrare lo strumento da riga di comando TEXTCOPY in una procedura memorizzata:
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
Dovrai modificarlo / estenderlo un po 'per leggere il file creato nell'altro database.
Come Vinko scrive nel commento a questa risposta, tenere presente che ciò richiede l'abilitazione di xp_cmdshell in superficie configurazione dell'area.
Descrizione di TEXTCOPY:
Copia un singolo valore di testo o immagine all'interno o all'esterno di SQL Server. Il valore è una "colonna" di testo o immagine specificata di una singola riga (specificata da " dove clausola ") della "tabella" specificata.
Se la direzione è IN (/ I), lo sono i dati dal 'file' specificato copiato in SQL Server, sostituendo il valore di testo o immagine esistente. Se la la direzione è OUT (/ O), quindi il valore del testo o dell'immagine viene copiato SQL Server nel "file" specificato, sostituendo qualsiasi file esistente.
Dai un'occhiata a questa domanda e cerca bcp nella pagina - ha un esempio sia di importazione che di esportazione per varbinary (max) (che è il nuovo tipo standard per tali colonne). puoi eseguire query arbitrarie per l'esportazione.
Come inserire un blob in un database usando sql server management studio