sql >> Database >  >> RDS >> Sqlserver

De wizard voor het genereren van scripts in SQL Server 2008 geeft me een script dat resulteert in niet-gesloten aanhalingstekens

Oplossing voor het SQL Server-importprobleem

Voorwaarde

Om de gegevens van de ene SQL Server naar de andere te verplaatsen (bijvoorbeeld van productieomgeving naar testomgeving) is het zinvol om de functie "Scripts genereren" te gebruiken die beschikbaar is in database-opties in SQL Server Management Studio. Het resultaat van deze bewerking is een tekstbestand met SQL-commando's dat op een andere SQL Server kan worden uitgevoerd. Meestal zijn deze bestanden te groot om ze in SQL Server Management Studio uit te voeren, dus moeten we sqlcmd gebruiken opdrachtregelhulpprogramma uit het installatiepakket van SQL Server. In de meeste gevallen werkt het hulpprogramma soepel en zijn aanvullende gebruikersacties niet nodig.

Probleembeschrijving

In enkele zeldzame gevallen wordt de sqlcmd hulpprogramma kan mislukken met de import en de volgende fout veroorzaken:"Niet-gesloten aanhalingsteken na de tekenreeks ..." wat aangeeft dat een van de SQL-query's niet is uitgevoerd. Dit gebeurt omdat sqlcmd werkt met stroomverwerking, d.w.z. het leest een stukje gegevens, verwerkt het, leest het volgende stuk enzovoort. In sommige gevallen kan een invoerbestand enorme SQL-instructies bevatten waarvan de grootte groter is dan de hoeveelheid gegevens die door sqlcmd kunnen worden verwerkt tegelijk, dus sqlcmd probeert gebroken SQL uit te voeren en faalt.

Mogelijke oplossingen

Om dit probleem op te lossen kunnen 2 benaderingen worden gebruikt:

  • De sqlcmd hulpprogramma kan de parameter "-a" accepteren die de maximale grootte van het pakket (stukje gegevens) definieert dat tijdens de verwerking zal worden gebruikt. De maximale waarde is 32767, de standaardwaarde is 4096, dus het is logisch om deze parameter altijd met de maximale waarde te gebruiken.

    sqlcmd -i input.sql -a 32767 -o import_log.txt
    
  • Als de eerste aanpak niet heeft geholpen en het probleem blijft zich voordoen, is er een andere, moeilijkere oplossing:

    • Installeer de Cygwin
      • Tijdens de installatie, na enkele standaardschermen, stop op het scherm "Selecteer pakketten"
      • Voer in het veld "Zoeken" "sed" in en vouw in de onderstaande boom de categorie "Base" uit en kies versie niet minder dan 4.2.2 voor installatie
      • Voltooi de installatie
      • Opmerking:"sed" is het Linux-hulpprogramma waarmee op streams gebaseerde bestandsverwerking mogelijk is
    • Nadat de installatie is voltooid, voert u "Cygwin64 Terminal" uit vanaf het bureaublad. We zullen het gebruiken voor de volgende stappen
    • Ga naar de directory waar het door SQL Server Management Studio gegenereerde SQL-bestand zich bevindt. U moet de slashes "/" in Linux-stijl gebruiken in plaats van de Windows-stijl "\"

        cd d:/temp
      
    • Wijzig de codering van het SQL-bestand van UTF-16LE naar UTF-8, omdat "sed" UTF-16LE niet kan verwerken, is deze conversie veilig voor de gegevens. Het resultaat is een nieuw bestand dat we in de volgende stap zullen gebruiken

        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      
    • Converteer het nieuwe bestand om één SQL-query in één batch te hebben. Het resultaat is een nieuw bestand dat we in de volgende stap zullen gebruiken

        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      
    • Nu zou het bestand "input_utf8_adapted.sql" zonder problemen door sqlcmd moeten worden verwerkt, zodat we het volgende kunnen uitvoeren:

        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      
    • Nadat de uitvoering is voltooid, controleert u import_log.txt om er zeker van te zijn dat er geen fouten zijn opgetreden



  1. Barcode genereren en lezen

  2. Alles wat u moet weten over SQL Server JOINS

  3. PreparedStatement erg traag, maar handmatige zoekopdracht snel

  4. FOUT:De verbinding staat in de autoCommit-modus