вторник, 7 апреля 2009 г.

Incorrect syntax near 'GO'

Недавно столкнулся со следующей проблемой: в моей программе нужно выполнять набор sql-скриптов, которые содержатся в файлах *.sql, на базе данных MS SQL Server 2005. Каждый такой скрипт в отдельности содержит инструкции по созданию таблиц, хранимых процедур, обновления данных и т.п., и т.д.

В этом случае использование привычных объектов SqlCommand и SqlDataAdapter приводит к генерации исключения времени выполнения со следующей ошибкой "Incorrect syntax near 'GO'". Это происходит из-за того, что в T-SQL на самом деле нет такой иструкции, но Query Analyzer разбирает запросы и интерпретирует комманду 'GO' как комманду отправки пакета комманд на сервер.

Один из вариантов решения проблемы состоит в использовании утилиты, идущей в поставке MS SQL Server, osql.exe. К сожалению, такой вариант не всегда является приемлемым.

Далее я привожу более простой вариант решения проблемы с использованием сборок MS SQL Server:

using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace MyProject.Sql
{
public class SampleSql
{
public static void ExcuteSql(string command, string connectionString)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();

var server = new Server(new ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery(command);
server.ConnectionContext.Disconnect();
}
}
}
}

Для выполнения данного кода необходимо подключить к проекту следующие сборки:

  • Microsoft.SqlServer.ConnectionInfo
  • Microsoft.Sqlserver.Smo

Вот собственно и все. Удачного вам программирования :)