Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Помощникът за генериране на скрипт на SQL Server 2008 ми дава скрипт, който води до незатворени кавички

Решение за проблема с импортирането на SQL Server

Предварително условие

За да преместите данните от един SQL Server в друг (напр. от производствена среда в тестова среда), има смисъл да използвате функцията „Генериране на скриптове“, която е налична в опциите за база данни в SQL Server Management Studio. Резултатът от тази операция е текстов файл с SQL команди, които могат да бъдат изпълнени на друг SQL Server. Обикновено тези файлове са твърде големи, за да ги изпълним в SQL Server Management Studio, така че трябва да използваме sqlcmd помощна програма за команден ред от инсталационния пакет на SQL Server. В повечето случаи помощната програма работи гладко и не са необходими допълнителни потребителски действия.

Описание на проблема

В някои редки случаи sqlcmd помощната програма може да се провали с импортирането и да предизвика следната грешка:„Незатворени кавички след символния низ ...“, което показва, че една от SQL заявките не е била изпълнена. Това се случва, защото sqlcmd работи с помощта на поточна обработка, т.е. чете част от данните, обработва ги, чете следващата част и т.н. В някои случаи входният файл може да съдържа огромна SQL инструкция, чийто размер е по-голям от количеството данни, които могат да бъдат обработени от sqlcmd наведнъж, така че sqlcmd се опитва да изпълни повреден SQL и не успява.

Възможни решения

За да се коригира този проблем, могат да се използват 2 подхода:

  • sqlcmd помощната програма може да приеме параметъра "-a", който определя максималния размер на пакета (част от данни), който ще се използва по време на обработката. Максималната стойност е 32767, стойността по подразбиране е 4096, така че има смисъл винаги да използвате този параметър с максимална стойност.

    sqlcmd -i input.sql -a 32767 -o import_log.txt
    
  • Ако първият подход не е помогнал и проблемът все още се появява, има друго, по-трудно решение:

    • Инсталирайте Cygwin
      • По време на инсталацията, след някои стандартни екрани, спрете на екрана „Избор на пакети“
      • В полето „Търсене“ въведете „sed“ и в дървото по-долу разгънете категорията „Базова“ и изберете версия не по-малка от 4.2.2 за инсталиране
      • Пълна инсталация
      • Забележка:"sed" е помощната програма на Linux, която позволява базирана на поток обработка на файлове
    • След като инсталацията приключи, стартирайте „Cygwin64 Terminal“ от работния плот. Ще го използваме за следващите стъпки
    • Отидете в директорията, където се намира SQL файлът, генериран от SQL Server Management Studio. Трябва да използвате наклонени черти в стила на Linux "/" вместо стила на Windows, който е "\"

        cd d:/temp
      
    • Променете кодирането на SQL файла от UTF-16LE на UTF-8, тъй като "sed" не може да обработва UTF-16LE, това преобразуване е безопасно за данните. Резултатът ще бъде нов файл, който ще използваме в следващата стъпка

        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      
    • Преобразувайте новия файл, за да имате една SQL заявка в една партида. Резултатът ще бъде нов файл, който ще използваме в следващата стъпка

        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      
    • Сега файлът "input_utf8_adapted.sql" трябва да бъде обработен от sqlcmd без никакви проблеми, така че можем да изпълним следното:

        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      
    • След като изпълнението приключи, моля, проверете import_log.txt, за да се уверите, че няма грешки



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изберете стойности от полето XML в SQL Server 2008

  2. Таблицата не може да се съкрати, защото се препраща от ограничение ВЪНШЕН КЛЮЧ - SQL Server / TSQL Урок, част 70

  3. Уникално ограничение само върху NON-NULL колони

  4. Име на екземпляр по подразбиране на SQL Server Express

  5. Синтаксична грешка близо до 'of' в условието за търсене в пълен текст 'control of'