Из .net как я могу отправить много «пакетов» SQL на Sql-Server без большого количества циклов? - PullRequest
5 голосов
/ 08 апреля 2011

У нас есть код, который читает набор файлов сценариев SQL, и после некоторой обработки он разбивает их на партии, находя ключевое слово «GO», а затем отправляет каждый пакет на Sql Server, используя отдельный SqlCommon.

Есть ли лучший способ сделать это, поэтому мы:

  • Не так много поездок туда и обратно
  • Никогда SQL Server не ожидает следующего пакета
  • Беги быстрее.

(Пакеты в основном создают таблицы, индексы, представления и хранимые процессы. Скорость является проблемой, так как наши интеграционные тесты часто вызывают код. Инструменты общей линии sql-сервера могут быть не установлены на машине, на которой выполняется этот код .)

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

2 идей ...

Упакуйте скрипт и измените его так, чтобы он работал как динамический фрагмент SQL.Загрузите весь пакет в потоке, используя nvarchar (max), и запустите его, используя sp_executesql на стороне сервера.Так как вы управляете им для интеграционного тестирования, динамический SQL не является большой проблемой.

Загрузите весь пакет на сервер как nvarchar (max).Сохраните файл на компьютере с SQL Server, используя xp_cmdshell или CLR или другое.Снова используя xp_cmdshell, используйте sqlcmd для запуска файла сценария.

При любом виде пакетной обработки вы теряете какой-то способ точно определить, где он сломался, так как в конце концов вы автоматизируете интеграционное тестирование.

2 голосов
/ 08 апреля 2011

Самое быстрое решение - это разделение на GO.Однако другой альтернативой является использование объектов управления SQL (SMO) и отправка всего сценария на SQL Server одним махом, как если бы вы использовали Management Studio.

var connectionString = ConfigurationManager.ConnectionStrings[ connectionStringName ].ConnectionString;
using ( var sqlConnection = new SqlConnection( connectionString ) )
{
    var server = new Server( new ServerConnection( sqlConnection ) );
    server.ConnectionContext.Connect();
    server.ConnectionContext.ExecuteNonQuery( sqlFileContents );
    server.ConnectionContext.Disconnect();
}

Объекты управления SQL Server(SMO)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...