Запустите несколько команд или сценарий SQL, используя OLE DB в SQL Server - PullRequest
1 голос
/ 27 июня 2010

Можно ли запустить несколько команд или сценарий sql, используя OLE DB?Например, запустить сценарий sql для создания базы данных и ее структуры (таблицы, индексы, хранимые процедуры ...).

Когда я использую класс CCommand, я могу запустить только одну команду.Как запустить скрипт SQL с несколькими командами?

Спасибо, Мартин

Ответы [ 3 ]

3 голосов
/ 27 июня 2010

Команда GO, которая разделяет операторы TSQL, НЕ является командой SQL, а оператором, распознаваемым только внешним интерфейсом.

Поэтому перед передачей результата объекту команды вам нужно явно разделить ваш скрипт на несколько команд в "\ nGO".

2 голосов
/ 27 июня 2010

Мартин - у меня была такая же проблема.Я предполагаю, что когда вы загружаете скрипт с одним или несколькими «go» в нем, вы получаете ошибку?

В прошлом я использовал SQL DMO для запуска скриптов с GO в них.Для этого требуется, чтобы SQLDMO был установлен на целевом компьютере.

Другой вариант - использовать функцию .NET "String.Split (" GO ")" и зацикливать полученный массив строк, выполняя их поone.

Примерно так:

StreamReader file = File.OpenText("c:\\MyScript.sql");
SqlConnection conn = new SqlConnection("My connection string here...");
string fullCommand = file.ReadToEnd();
string[] splitOptions = new string[] {"go", "GO", "gO", "Go" };
foreach (string individualCommand in fullCommand.Split(splitOptions, StringSplitOptions.RemoveEmptyEntries))
{
    SqlCommand comm = new SqlCommand(individualCommand, conn);
    comm.ExecuteNonQuery();
}

Отказ от ответственности: я не проверял приведенный выше код, но он должен дать вам представление о том, что требуется: -)

1 голос
/ 27 июня 2010

Я отправил несколько операторов, таких как INSERT INTO; INSERT INTO (точки с запятой не требуются в SQL Server.

Некоторые операторы (например, CREATE FUNCTION) должны быть первыми в «Пакете». В SSMS и sqlcmd у вас есть разделитель GO, который является клиентским инструментом для разделения пакетов. Это не функция OLEDB, поэтому вам придется отправлять их отдельно - в отдельном вызове последовательно или параллельно (в зависимости от того, могут ли ваши операции выполняться одновременно).

Если вы можете отойти от CCommand, я думаю, вы могли бы запустить sqlcmd, так как он поддерживает разделители пакетов GO.

...