Я получил эту же ошибку. Я заметил, что расширение диспетчера пакетов NuGet имеет обновление. После установки этого обновления ошибка исчезла.
Убедитесь, что все доступные обновления применяются. Чтобы проверить, есть ли доступные обновления, откройте Инструменты> Расширения и обновления. В диалоговом окне «Расширения и обновления» разверните узел «Обновления» на левой панели. Установите все доступные обновления и перезапустите Visual Studio 2012.
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"
Плохой способ исправить это: разделить 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,
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.
проверьте свои скрипты:
установить сценарии: