Мастер создания сценариев SQL Server 2008 дает мне сценарий, который приводит к «незамеченным кавычкам» - PullRequest
2 голосов
/ 12 сентября 2010

У меня есть экземпляр базы данных SQL Server 2008 на одном компьютере. Теперь я хочу скопировать эту базу данных на другую машину. Я использую мастер сценариев в SQL Management Studio для генерации SQl-сценария со схемой и данными. Файл сценария довольно большой (около 17 ГБ).

Затем я запускаю sql-скрипт на целевой машине, в результате получается:

Сообщение 105, уровень 15, ошибка состояния 1 с сообщением: Незакрытая кавычка после символьной строки

Я понимаю проблему значения незакрытых кавычек. Но я не понимаю, почему происходит ошибка. Разве генератор сценариев не может обрабатывать цитаты внутри текстовых строк, такие как ... привет, как дела ... правильно и создавать сценарий, который будет экранировать такие символы?

Есть ли ограничения на длину текста для мастера сценариев? Это вызывает проблему.

Я не хочу, и я не могу открыть файл сценария в текстовом редакторе (слишком большой, текстовый редактор будет зависать) и вручную устранить проблемы.

У вас есть идеи?

Ответы [ 4 ]

4 голосов
/ 23 декабря 2014

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

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

Для перемещения данных с одного SQL Server на другой (например, из производственной среды в тестовую среду) имеет смысл использовать функцию «Создать сценарии», которая доступна в параметрах базы данных в SQL Server Management Studio. Результатом этой операции является текстовый файл с командами SQL, которые могут быть выполнены на другом сервере SQL. Обычно эти файлы слишком велики для выполнения в 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» с рабочего стола. Мы будем использовать его для следующих шагов
    • Перейдите в каталог, где находится файл 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, чтобы убедиться в отсутствии ошибок

0 голосов
/ 06 февраля 2019

Я остановился на этом вопросе после попытки найти решение похожей проблемы, которая у меня была. Мне также нужно было сбросить БД (с данными) с помощью мастера создания сценариев, и полученный файл был слишком большим для выполнения из SSMS. Поэтому я попробовал sqlcmd, но закончил с ошибкой

Sqlcmd: Ошибка: синтаксическая ошибка в строке 10 рядом с командой "" "в файле" script.sql ".

Оказалось, что причиной проблемы была запись, содержащая данные с синтаксисом jQuery - $(".someclass"). Это потому, что это также способ вставить переменную в sqlcmd.

Решение состоит в том, чтобы отключить подстановку переменных, добавив -x аргумент командной строки.

0 голосов
/ 12 сентября 2010

РЕДАКТИРОВАТЬ: только что отметил из вашего комментария, что вы работаете sqlcmd -S server\database -i script.sql.Существует переключатель -I, который обозначает «Включить идентификаторы в кавычках».Попробуйте выполнить команду с этим переключателем.

Кстати, чтобы редактировать большой файл, рассмотрите возможность использования хорошего редактора, например Notepad ++ или UltraEdit .Я бы не использовал рабочую станцию ​​без em:)

0 голосов
/ 12 сентября 2010

Не прямой ответ на вопрос, но для решения этой проблемы вы можете использовать один из следующих других методов копирования базы данных в новое местоположение.

  1. Копирование баз данных с помощью Backup иВосстановление
  2. Использование отсоединения и присоединения

Обычно предпочтителен способ 1, поскольку он поддерживает исходную БД в оперативном режиме, а отсоединение может привести к хранению информации, хранящейся в ведущем устройстве.база данных об источнике, который должен быть потерян (например, полный текст включен)

...