Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

L'assistant de génération de script SQL Server 2008 me donne un script qui se traduit par des guillemets non fermés

Solution pour le problème d'importation SQL Server

Condition préalable

Afin de déplacer les données d'un serveur SQL à un autre (par exemple, de l'environnement de production à l'environnement de test), il est logique d'utiliser la fonctionnalité "Générer des scripts" qui est disponible dans les options de base de données de SQL Server Management Studio. Le résultat de cette opération est un fichier texte avec des commandes SQL qui peuvent être exécutées sur un autre serveur SQL. Habituellement, ces fichiers sont trop volumineux pour les exécuter dans SQL Server Management Studio, nous devons donc utiliser sqlcmd utilitaire de ligne de commande du package d'installation de SQL Server. Dans la plupart des cas, l'utilitaire fonctionne sans problème et aucune action supplémentaire de l'utilisateur n'est nécessaire.

Description du problème

Dans de rares cas, le sqlcmd L'utilitaire peut échouer à l'import et générer l'erreur suivante :"Guillemet non fermé après la chaîne de caractères..." qui indique qu'une des requêtes SQL n'a pas été exécutée. Cela se produit parce que sqlcmd fonctionne en utilisant le traitement de flux, c'est-à-dire qu'il lit une donnée, la traite, lit la pièce suivante, etc. Dans certains cas, un fichier d'entrée peut contenir d'énormes instructions SQL dont la taille est supérieure à la quantité de données pouvant être traitées par sqlcmd à la fois, donc sqlcmd tente d'exécuter un code SQL défectueux et échoue.

Solutions possibles

Afin de résoudre ce problème, 2 approches peuvent être utilisées :

  • Le sqlcmd L'utilitaire peut accepter le paramètre "-a" qui définit la taille maximale du paquet (élément de données) qui sera utilisé lors du traitement. La valeur maximale est 32767, la valeur par défaut est 4096, il est donc logique de toujours utiliser ce paramètre avec une valeur maximale.

    sqlcmd -i input.sql -a 32767 -o import_log.txt
    
  • Si la première approche n'a pas aidé et que le problème persiste, il existe une autre solution plus difficile :

    • Installer Cygwin
      • Lors de l'installation, après quelques écrans standards, arrêtez-vous sur l'écran "Sélectionner les packages"
      • Dans le champ "Rechercher", entrez "sed", et dans l'arborescence ci-dessous, développez la catégorie "Base" et choisissez la version au moins 4.2.2 pour l'installation
      • Installation complète
      • Remarque :"sed" est l'utilitaire Linux qui permet le traitement de fichiers basé sur le flux
    • Une fois l'installation terminée, exécutez "Cygwin64 Terminal" à partir du bureau. Nous l'utiliserons pour les prochaines étapes
    • Accédez au répertoire où se trouve le fichier SQL généré par SQL Server Management Studio. Vous devez utiliser les barres obliques de style Linux "/" au lieu du style Windows qui est "\"

        cd d:/temp
      
    • Modifiez l'encodage du fichier SQL de UTF-16LE à UTF-8, car "sed" ne peut pas traiter UTF-16LE, cette conversion est sans danger pour les données. Le résultat sera un nouveau fichier, que nous utiliserons à l'étape suivante

        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      
    • Convertissez le nouveau fichier pour avoir une requête SQL dans un lot. Le résultat sera un nouveau fichier, que nous utiliserons à l'étape suivante

        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      
    • Maintenant, le fichier "input_utf8_adapted.sql" devrait être traité par sqlcmd sans aucun problème, nous pouvons donc exécuter ce qui suit :

        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      
    • Une fois l'exécution terminée, veuillez vérifier import_log.txt pour vous assurer qu'aucune erreur n'est apparue