Управление выполнением SQL в базе данных с использованием ошибки sp_EXECUTESQL с помощью оператора 'GO' - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть приложение, которое будет управлять выпусками изменений DDL и операторов TSql Executable для базы данных сервера SQL.

Основной рабочий процесс: разработчик отправляет файл .sql, файл собирается, проверяет SQL и назначает шаг в цикле выпуска, выпуск выполняется в базе данных с использованием хранимой процедуры, и он будет циклически повторять этапы выполнения SQLв рамках одной транзакции SQL с использованием sp_EXECUTESQL.Если возникают какие-либо ошибки, транзакция не фиксирует изменения DDL.Этот процесс управляет SQL из одной базы данных в несколько баз данных в одном экземпляре.

Проблема, с которой я столкнулся, заключается в том, что при отправке сценариев SQL они содержат операторы "GO", которые sp_EXECUTESQL не поддерживает, и выдают "Неправильно"синтаксис около 'GO' "ошибка.Я могу разделить и разбить большинство транзакций, анализируя ключевое слово «GO», но это не будет работать для элементов, находящихся в других базах данных.Когда у меня есть какой-то ALTER для другой базы данных, мне нужно «GO».например, следующее не может быть выполнено вместе, не может быть разделено и выполнено как два оператора:

USE [MyDatabaseOtherThanOneIAmExecutingFrom]
GO
Alter PROCEDURE [dbo].[DoSomething]
...

Синтаксически следующий оператор не будет работать, поэтому запрос разработчиков изменить свой sql на префикс с именем db будеттолько для не DDL SQL:

 Alter PROCEDURE [MyDatabaseOtherThanOneIAmExecutingFrom].[dbo].[DoSomething]

Первоначальное требование заключалось в том, чтобы оставаться в базе данных для выполнения этих действий по развертыванию, поэтому не было возможности написать короткое одноразовое приложение для выполнения пакетов из .Net с использованием SqlCommand.

Есть ли другой вариант для обработки этого в базе данных или мне нужно выйти наружу и создать приложение для управления выполнением шагов SQL?

Ответы [ 3 ]

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

Вы можете вкладывать вызовы sp_executesql.Это немного уродливо, но работает и позволяет выполнять DDL для других баз данных:

sp_executesql N'use OtherDB exec sp_executesql N''create procedure DoStuff @Parm1 varchar(10) as select * from sysobjects'''
0 голосов
/ 05 апреля 2011

Во-первых, самое простое решение - принудительно разделить GO и попытаться заставить файлы sql соответствовать этому. За исключением этого, вы можете создать пакет служб SSIS, который передает пути к файлам в задачу «Выполнение SQL» и выполняет ее таким образом. Если это не работает для вас, то ваше последнее решение будет использовать объекты управления SQL Server, которые позволяют вам массово отправить весь сценарий на сервер. Чтобы использовать SMO, вам нужно создать небольшое приложение в C # или VB.NET, которое обрабатывает файлы и передает сценарий SMO.

Пакет дополнительных компонентов для Microsoft SQL Server 2005 - ноябрь 2005

(Прокрутите вниз до коллекции объектов управления Microsoft SQL Server 2005)

0 голосов
/ 05 апреля 2011

Пока вы можете, своими словами, split and break up most transactions by parsing on the 'GO' keyword, я просто не вижу проблемы.

Просто сделайте это и выполните группы операторов между GO последовательно, т.е. в Пакет , используя то же соединение, не прерывая последнее.По сути, именно так SSMS, а также sqlcmd.exe и osql.exe интерпретируют 'GO' (простите за каламбур).

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