Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso generare uno script INSERT per una tabella con un campo VARBINARY(MAX)?

Se questa è una cosa da fare una volta (o raramente), puoi provare a eseguire lo script dei dati fuori dalla procedura guidata SSMS come descritto qui:

http:/ /sqlblog.com/blogs/eric_johnson/archive/2010/03/08/script-data-in-sql-server-2008.aspx

Oppure, se hai bisogno di farlo frequentemente e vuoi automatizzarlo, puoi provare SQL# Libreria SQLCLR (che ho scritto e sebbene la maggior parte sia gratuita, la funzione di cui hai bisogno qui non lo è). La funzione per farlo è DB_DumpData e genera anche INSERT dichiarazioni.

Ma ancora una volta, se si tratta di un'attività una tantum o non frequente, provare l'esportazione guidata dei dati integrata in Management Studio. Ciò dovrebbe consentirti di creare lo script SQL che puoi eseguire in Produzione. L'ho appena testato su un tavolo con un VARBINARY(MAX) campo contenente 3.365.964 byte di dati e la procedura guidata Genera script ha generato un INSERT istruzione con l'intera stringa esadecimale di 6,73 milioni di caratteri per quell'unico valore.

AGGIORNAMENTO:
Un altro modo semplice e veloce per farlo in un modo che ti permetta di copiare/incollare l'intera istruzione INSERT in uno script SQL senza doversi preoccupare di BCP o SSMS Export Wizard è semplicemente convertire il valore in XML . Per prima cosa devi CONVERT il VARBINARY a VARCHAR(MAX) usando lo stile opzionale di "1" che ti dà una stringa esadecimale che inizia con "0x". Una volta che hai la stringa esadecimale dei dati binari, puoi concatenarla in un INSERT istruzione e tutto il resto, una volta convertito in XML , può contenere l'intero VARBINARY campo. Vedi il seguente esempio:

DECLARE @Binary VARBINARY(MAX) = CONVERT(VARBINARY(MAX),
                                         REPLICATE(
                                           CONVERT(NVARCHAR(MAX), 'test string'),
                                           100000)
                                        )

SELECT 'INSERT INTO dbo.TableName (ColumnName) VALUES ('+
       CONVERT(VARCHAR(MAX), @Binary, 1) + ')' AS [Insert]
FOR XML RAW;