sql >> Base de Datos >  >> RDS >> Sqlserver

El asistente de generación de secuencias de comandos de SQL Server 2008 me da una secuencia de comandos que da como resultado comillas sin cerrar

Solución para el problema de importación de SQL Server

Condición previa

Para mover los datos de un servidor SQL a otro (por ejemplo, del entorno de producción al entorno de prueba), tiene sentido usar la función "Generar scripts" que está disponible en las opciones de la base de datos en SQL Server Management Studio. El resultado de esta operación es un archivo de texto con comandos SQL que se pueden ejecutar en otro servidor SQL. Por lo general, estos archivos son demasiado grandes para ejecutarlos en SQL Server Management Studio, por lo que debemos usar sqlcmd utilidad de línea de comandos del paquete de instalación de SQL Server. En la mayoría de los casos, la utilidad funciona sin problemas y no es necesario realizar acciones adicionales por parte del usuario.

Descripción del problema

En algunos casos raros, el sqlcmd La utilidad puede fallar con la importación y generar el siguiente error:"Comillas no cerradas después de la cadena de caracteres...", lo que indica que una de las consultas SQL no se ha ejecutado. Esto sucede porque sqlcmd funciona utilizando el procesamiento de flujo, es decir, lee algunos datos, los procesa, lee la siguiente pieza y así sucesivamente. En algunos casos, un archivo de entrada puede contener una enorme instrucción SQL cuyo tamaño es mayor que la cantidad de datos que podría procesar sqlcmd a la vez, por lo que sqlcmd intenta ejecutar SQL roto y falla.

Posibles soluciones

Para solucionar este problema, se pueden utilizar 2 enfoques:

  • El sqlcmd La utilidad puede aceptar el parámetro "-a" que define el tamaño máximo del paquete (pieza de datos) que se utilizará durante el procesamiento. El valor máximo es 32767, el valor predeterminado es 4096, por lo que tiene sentido usar siempre este parámetro con el valor máximo.

    sqlcmd -i input.sql -a 32767 -o import_log.txt
    
  • Si el primer enfoque no ayudó y el problema sigue apareciendo, existe otra solución más difícil:

    • Instalar Cygwin
      • Durante la instalación, después de algunas pantallas estándar, deténgase en la pantalla "Seleccionar paquetes"
      • En el campo "Buscar", ingrese "sed", y en el árbol a continuación, expanda la categoría "Base" y elija una versión no inferior a 4.2.2 para la instalación
      • Instalación completa
      • Nota:"sed" es la utilidad de Linux que permite el procesamiento de archivos basado en secuencias
    • Después de completar la instalación, ejecute "Terminal Cygwin64" desde el escritorio. Lo usaremos para los próximos pasos
    • Vaya al directorio donde se encuentra el archivo SQL generado por SQL Server Management Studio. Debe usar barras diagonales de estilo Linux "/" en lugar del estilo de Windows, que es "\"

        cd d:/temp
      
    • Cambie la codificación del archivo SQL de UTF-16LE a UTF-8, porque "sed" no puede procesar UTF-16LE, esta conversión es segura para los datos. El resultado será un archivo nuevo, que usaremos en el siguiente paso

        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      
    • Convierta el nuevo archivo para tener una consulta SQL en un lote. El resultado será un archivo nuevo, que usaremos en el siguiente paso

        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      
    • Ahora el archivo "input_utf8_adapted.sql" debe ser procesado por sqlcmd sin ningún problema, por lo que podemos ejecutar lo siguiente:

        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      
    • Una vez finalizada la ejecución, compruebe import_log.txt para asegurarse de que no aparecen errores