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

La procedura guidata di generazione dello script di SQL Server 2008 mi fornisce uno script che si traduce in virgolette non chiuse

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