Неправильный синтаксис около 'GO'
Как я могу выполнить следующий SQL внутри одной команды (одно выполнение) через ADO.NET?
ALTER TABLE [MyTable]
ADD NewCol INT
GO
UPDATE [MyTable]
SET [NewCol] = 1
Секундомер GO
не поддерживается, и без него второй оператор терпит неудачу.
Есть ли какие-либо решения для этого, кроме использования нескольких command
исполнений?
Ответы
Ответ 1
Ключевое слово GO
- это не T-SQL, а артефакт SQL Server Management Studio, который позволяет вам разделить выполнение файла script несколькими партиями. Т.е. когда вы запускаете файл T-SQL script в SSMS, операторы выполняются партиями, разделенными ключевым словом GO
. Более подробную информацию можно найти здесь: https://msdn.microsoft.com/en-us/library/ms188037.aspx
Если вы прочтете это, вы увидите, что sqlcmd и osql также поддерживают GO
.
SQL Server не понимает ключевое слово GO
. Поэтому, если вам нужен эквивалент, вам нужно отдельно отделить и запустить партии по отдельности.
Ответ 2
Удалите GO
:
String sql = "ALTER TABLE [MyTable] ADD NewCol INT;";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
sql = "UPDATE [MyTable] SET [NewCol] = 1";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
Кажется, вы можете использовать Server
класс. Вот статья:
С#: Выполнение пакетных T-SQL-скриптов, содержащих инструкции GO
Ответ 3
Вы также получите эту ошибку, если вы использовали операторы IF и неправильно закрыли их.
Помните, что вы должны использовать BEGIN/END, если оператор IF длиннее одной строки.
Это работает:
IF @@ROWCOUNT = 0
PRINT 'Row count is zero.'
Но если у вас две строки, это должно выглядеть так:
IF @@ROWCOUNT = 0
BEGIN
PRINT 'Row count is zero.'
PRINT 'You should probably do something about that.'
END