Soluzione per il problema di importazione di SQL Server
Pre-condizione
Per spostare i dati da un SQL Server all'altro (ad es. dall'ambiente di produzione all'ambiente di test), ha senso utilizzare la funzione "Genera script" disponibile nelle opzioni del database in SQL Server Management Studio. Il risultato di questa operazione è un file di testo con comandi SQL che possono essere eseguiti su un altro SQL Server. Di solito questi file sono troppo grandi per eseguirli in SQL Server Management Studio, quindi è necessario utilizzare sqlcmd utilità della riga di comando dal pacchetto di installazione di SQL Server. Nella maggior parte dei casi, l'utilità funziona senza problemi e non sono necessarie ulteriori azioni dell'utente.
Descrizione del problema
In alcuni rari casi sqlcmd l'utilità può non riuscire con l'importazione e generare il seguente errore:"virgolette non chiuse dopo la stringa di caratteri ..." che indica che una delle query SQL non è stata eseguita. Ciò accade perché sqlcmd funziona utilizzando l'elaborazione del flusso, ovvero legge alcuni dati, li elabora, legge il pezzo successivo e così via. In alcuni casi un file di input può contenere enormi istruzioni SQL la cui dimensione è maggiore della quantità di dati che potrebbero essere elaborati da sqlcmd alla volta, quindi sqlcmd tenta di eseguire SQL non funzionante e non riesce.
Possibili soluzioni
Per risolvere questo problema è possibile utilizzare 2 approcci:
-
Il sqlcmd l'utilità può accettare il parametro "-a" che definisce la dimensione massima del pacchetto (pezzo di dati) che verrà utilizzato durante l'elaborazione. Il valore massimo è 32767, il valore predefinito è 4096, quindi ha senso utilizzare sempre questo parametro con il valore massimo.
sqlcmd -i input.sql -a 32767 -o import_log.txt
-
Se il primo approccio non ha aiutato e il problema persiste, c'è un'altra soluzione più difficile:
- Installa Cygwin
- Durante l'installazione, dopo alcune schermate standard, fermati sulla schermata "Seleziona pacchetti"
- Nel campo "Cerca", inserisci "sed", e nell'albero sottostante espandi la categoria "Base" e scegli la versione non inferiore alla 4.2.2 per l'installazione
- Installazione completata
- Nota:"sed" è l'utility Linux che consente l'elaborazione di file basata su stream
- Al termine dell'installazione, eseguire "Cygwin64 Terminal" dal desktop. Lo useremo per i prossimi passi
-
Passare alla directory in cui si trova il file SQL generato da SQL Server Management Studio. Devi usare le barre in stile Linux "/" invece dello stile Windows che è "\"
cd d:/temp
-
Modificare la codifica del file SQL da UTF-16LE a UTF-8, poiché "sed" non può elaborare UTF-16LE, questa conversione è sicura per i dati. Il risultato sarà un nuovo file, che useremo nel passaggio successivo
iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
-
Converti il nuovo file per avere una query SQL in un batch. Il risultato sarà un nuovo file, che useremo nel passaggio successivo
sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
-
Ora il file "input_utf8_adapted.sql" dovrebbe essere elaborato da sqlcmd senza problemi, quindi possiamo eseguire quanto segue:
sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
-
Al termine dell'esecuzione, controlla import_log.txt per assicurarti che non siano comparsi errori
- Installa Cygwin