Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kreator generowania skryptów SQL Server 2008 daje mi skrypt, w wyniku którego pojawiają się niezamknięte cudzysłowy

Rozwiązanie problemu importu SQL Server

Warunek wstępny

W celu przeniesienia danych z jednego serwera SQL na inny (np. ze środowiska produkcyjnego do środowiska testowego) warto skorzystać z funkcji „Generuj skrypty” dostępnej w opcjach bazy danych w SQL Server Management Studio. Wynikiem tej operacji jest plik tekstowy z poleceniami SQL, które można wykonać na innym serwerze SQL. Zazwyczaj te pliki są zbyt duże, aby wykonać je w SQL Server Management Studio, więc musimy użyć sqlcmd narzędzie wiersza polecenia z pakietu instalacyjnego programu SQL Server. W większości przypadków narzędzie działa płynnie i dodatkowe działania użytkownika nie są konieczne.

Opis problemu

W niektórych rzadkich przypadkach sqlcmd Narzędzie może zakończyć się niepowodzeniem podczas importu i zgłosić następujący błąd:„Niezamknięty cudzysłów po ciągu znaków...”, który wskazuje, że jedno z zapytań SQL nie zostało wykonane. Dzieje się tak, ponieważ sqlcmd pracuje z przetwarzaniem strumieniowym, tj. odczytuje jakąś część danych, przetwarza ją, odczytuje następną i tak dalej. W niektórych przypadkach plik wejściowy może zawierać duże instrukcje SQL, których rozmiar jest większy niż ilość danych, które mogą być przetworzone przez sqlcmd na raz, więc sqlcmd próbuje wykonać zepsuty kod SQL i kończy się niepowodzeniem.

Możliwe rozwiązania

Aby rozwiązać ten problem, można zastosować 2 podejścia:

  • sqlcmd narzędzie może zaakceptować parametr "-a", który określa maksymalny rozmiar pakietu (kawałek danych), który zostanie użyty podczas przetwarzania. Maksymalna wartość to 32767, domyślna to 4096, więc warto zawsze używać tego parametru z maksymalną wartością.

    sqlcmd -i input.sql -a 32767 -o import_log.txt
    
  • Jeśli pierwsze podejście nie pomogło i problem nadal się pojawia, istnieje inne, trudniejsze rozwiązanie:

    • Zainstaluj Cygwin
      • Podczas instalacji, po kilku standardowych ekranach, zatrzymaj się na ekranie „Wybierz pakiety”
      • W polu „Szukaj” wpisz „sed”, a w drzewku poniżej rozwiń kategorię „Podstawa” i wybierz wersję nie mniejszą niż 4.2.2 do instalacji
      • Zakończ instalację
      • Uwaga:"sed" to narzędzie Linuksa, które umożliwia przetwarzanie plików oparte na strumieniu
    • Po zakończeniu instalacji uruchom „Cygwin64 Terminal” z pulpitu. Wykorzystamy go w następnych krokach
    • Przejdź do katalogu, w którym znajduje się plik SQL wygenerowany przez SQL Server Management Studio. Musisz użyć ukośników w stylu Linux "/" zamiast stylu Windows, czyli "\"

        cd d:/temp
      
    • Zmień kodowanie pliku SQL z UTF-16LE na UTF-8, ponieważ "sed" nie może przetwarzać UTF-16LE, ta konwersja jest bezpieczna dla danych. Rezultatem będzie nowy plik, którego użyjemy w następnym kroku

        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      
    • Przekonwertuj nowy plik, aby mieć jedno zapytanie SQL w jednej partii. Rezultatem będzie nowy plik, którego użyjemy w następnym kroku

        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      
    • Teraz plik "input_utf8_adapted.sql" powinien zostać przetworzony przez sqlcmd bez żadnych problemów, więc możemy wykonać następujące czynności:

        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      
    • Po zakończeniu działania sprawdź plik import_log.txt, aby upewnić się, że nie pojawiły się żadne błędy



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Obrót wielu kolumn w T-SQL

  2. Dlaczego funkcje SQL Server o wartościach skalarnych działają wolniej?

  3. Błąd funkcji agregującej podczas używania klauzuli group by w SQL

  4. Jak zainstalować SQL Server w Red Hat 8?

  5. SQL Server ROWLOCK nad SELECT, jeśli nie istnieje INSERT transakcja