Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O assistente de geração de script do SQL Server 2008 fornece um script que resulta em aspas não fechadas

Solução para o problema de importação do SQL Server

Pré-condição


Para mover os dados de um SQL Server para outro (por exemplo, do ambiente de produção para o ambiente de teste) faz sentido usar o recurso "Gerar scripts" que está disponível nas opções de banco de dados no SQL Server Management Studio. O resultado desta operação é um arquivo texto com comandos SQL que podem ser executados em outro SQL Server. Normalmente, esses arquivos são muito grandes para executá-los no SQL Server Management Studio, portanto, precisamos usar o sqlcmd utilitário de linha de comando do pacote de instalação do SQL Server. Na maioria dos casos, o utilitário funciona sem problemas e não são necessárias ações adicionais do usuário.

Descrição do problema


Em alguns casos raros, o sqlcmd utilitário pode falhar com a importação e gerar o seguinte erro:"Aspas não fechadas após a cadeia de caracteres ..." que indica que uma das consultas SQL não foi executada. Isso acontece porque sqlcmd funciona usando processamento de fluxo, ou seja, ele lê alguns dados, processa-os, lê a próxima parte e assim por diante. Em alguns casos, um arquivo de entrada pode conter uma instrução SQL enorme cujo tamanho é maior que a quantidade de dados que podem ser processados ​​pelo sqlcmd de cada vez, então sqlcmd tenta executar SQL quebrado e falha.

Soluções possíveis


Para corrigir esse problema, duas abordagens podem ser usadas:

  • O sqlcmd O utilitário pode aceitar o parâmetro "-a" que define o tamanho máximo do pacote (parte de dados) que será usado durante o processamento. O valor máximo é 32767, o valor padrão é 4096, então faz sentido usar sempre este parâmetro com valor máximo.
    sqlcmd -i input.sql -a 32767 -o import_log.txt
    

  • Se a primeira abordagem não ajudar e o problema ainda aparecer, há outra solução mais difícil:
    • Instale o Cygwin
      • Durante a instalação, após algumas telas padrão, pare na tela "Selecionar pacotes"
      • No campo "Pesquisar", digite "sed" e na árvore abaixo expanda a categoria "Base" e escolha a versão não inferior a 4.2.2 para instalação
      • Instalação completa
      • Observação:"sed" é o utilitário do Linux que permite o processamento de arquivos baseado em fluxo
    • Após a conclusão da instalação, execute "Cygwin64 Terminal" na área de trabalho. Vamos usá-lo para as próximas etapas

    • Vá para o diretório onde está localizado o arquivo SQL gerado pelo SQL Server Management Studio. Você precisa usar barras no estilo Linux "/" em vez do estilo Windows, que é "\"
        cd d:/temp
      

    • Altere a codificação do arquivo SQL de UTF-16LE para UTF-8, pois "sed" não pode processar UTF-16LE, essa conversão é segura para os dados. O resultado será um novo arquivo, que usaremos na próxima etapa
        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      

    • Converta o novo arquivo para ter uma consulta SQL em um lote. O resultado será um novo arquivo, que usaremos na próxima etapa
        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      

    • Agora o arquivo "input_utf8_adapted.sql" deve ser processado pelo sqlcmd sem problemas, então podemos executar o seguinte:
        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      

    • Após a execução, verifique import_log.txt para certificar-se de que nenhum erro apareceu