Используя “ДВИЖЕНИЕ” в рамках транзакции

Я получил эту же ошибку. Я заметил, что расширение диспетчера пакетов NuGet имеет обновление. После установки этого обновления ошибка исчезла.

Убедитесь, что все доступные обновления применяются. Чтобы проверить, есть ли доступные обновления, откройте Инструменты> Расширения и обновления. В диалоговом окне «Расширения и обновления» разверните узел «Обновления» на левой панели. Установите все доступные обновления и перезапустите Visual Studio 2012.

53
задан tjmoore 1 May 2013 в 23:07
поделиться

4 ответа

GO is not a SQL keyword.

It's a batch separator used by client tools (like SSMS) to break the entire script up into batches

You'll have to break up the script into batches yourself or use something like sqlcmd with "-c GO" or osql to deal with "GO"

63
ответ дан 7 November 2019 в 08:27
поделиться

Плохой способ исправить это: разделить SQL на операторы GO. Примерно так:

private static List<string> getCommands(string testDataSql)
{
    string[] splitcommands = File.ReadAllText(testDataSql).Split(new string[]{"GO\r\n"}, StringSplitOptions.RemoveEmptyEntries);
    List<string> commandList = new List<string>(splitcommands);
    return commandList;
}

[фактически скопировано из приложения, над которым я сейчас работаю. Я запомнил этот код]

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

# # # # # БОНУСНЫЕ ПУНКТЫ # # # # # #

Как обрабатывать биты транзакции, действительно зависит от операционных целей. В основном вы могли бы сделать это двумя способами:

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

b) Оберните каждый вызов в ExecuteNonQuery () в собственной транзакции. На самом деле, каждый звонок - это отдельная транзакция. Но вы можете перехватить исключения и перейти к следующему пункту. Конечно, если это типичный сгенерированный материал DDL,

18
ответ дан 7 November 2019 в 08:27
поделиться

EDIT as pointed out below I specified tran where batch was actually correct.

The issue is not that you cannot use GO within a transaction so much as GO indicates the end of a batch, and is not itself a T-SQL command. You could execute the whole script using SQLCMD, or split it on the GO's and execute each batch in turn.

5
ответ дан 7 November 2019 в 08:27
поделиться

проверьте свои скрипты:

  • восстановить производственную резервную копию на сервере резервного копирования
  • запустить сценарии запуска с помощью GOs

установить сценарии:

  • закрыть приложение
  • перейти в однопользовательский режим
  • резервное копирование базы данных
  • запустить сценарии с помощью GO , при отказе восстановить резервную копию
  • вернуться в многопользовательский режим
  • перезапустить приложение
2
ответ дан 7 November 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: