powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не выполнять батчи, если не выполнилось условие
7 сообщений из 7, страница 1 из 1
Не выполнять батчи, если не выполнилось условие
    #40092013
newbie876454
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть скрипт вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if object_id('dbo.proc1') is not null
	drop proc dbo.proc1
go
create proc dbo.proc1
as
begin
    select 1
end
go
--и тут еще сотня таких же процедур, вьюшек и т.д.
--они время от времени меняются, и накатываются на продакшн сразу целиком всем скриптом




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

делаю так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if 1=0 --какое-то мое условие, например оно сейчас false
	raiserror('проверка не прошла. Скрипт не должен выполниться', 16, 1)

if object_id('dbo.proc1') is not null
	drop proc dbo.proc1
go
create proc dbo.proc1
as
begin
    select 1
end
go
print 'тестовое сообщение, которое не должно вылезти'




но в этом случае скрипт не прерывается, а код идет дальше, т.к. указаны GO, то есть отдельные батчи
без деления на батчи не работает скрипт
в ветку else с батчами тоже нельзя код добавлять
пробовал транзакцией, но этот вариант не нравится тем, что код все же выполняется и потом откатывается, а хотелось бы чтобы не выполнялся вообще (т.к. иногда он выполняется почему-то долго, несколько секунд подвисает, т.к. пересоздаются linked-сервера и др объекты, да и к тому же это создает лишнюю блокировку). да и проверка идет в самом конце - неудобно, нелогично

как быть?



включить код пересоздания процедур внутрь ELSE синтаксис не позволяет, т.к. там используется GO, без которого не работает:
...
Рейтинг: 0 / 0
Не выполнять батчи, если не выполнилось условие
    #40092021
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454,

не старайтесь управлять потоком исполнения из t-sql.
напишите обертку vbs/powershell/etc которая будет использовать вашу условную логику.

или используйте динамическое формирование своего скрипта.
...
Рейтинг: 0 / 0
Не выполнять батчи, если не выполнилось условие
    #40092040
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454
хочется в начале скрипта выполнить проверку и в зависимости от этого выполнить весь дальнейший скрипт или не выполнить его вовсе и сообщить юзеру ошибку
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
set noexec off;
if 1=0 --какое-то мое условие, например оно сейчас false
  begin
   raiserror('проверка не прошла. Скрипт не должен выполниться', 16, 1)
   set noexec on;
  end;
go

if object_id('dbo.proc1') is not null
	drop proc dbo.proc1
go
create proc dbo.proc1
as
begin
    select 1
end
go
print 'тестовое сообщение, которое не должно вылезти'
...
Рейтинг: 0 / 0
Не выполнять батчи, если не выполнилось условие
    #40092120
newbie876454
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Ого! То что надо!
Вот это волшебство!
Откуда такие познания?!
...
Рейтинг: 0 / 0
Не выполнять батчи, если не выполнилось условие
    #40092128
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454

Вот это волшебство!
Откуда такие познания?!

документация и не первый день в sql
...
Рейтинг: 0 / 0
Не выполнять батчи, если не выполнилось условие
    #40092157
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454,

если совсем жестко действовать то при участии в роли администратора

Код: sql
1.
raiserror('batch termination', 20, 1) with log



прервёт сеанс и запишет в errorlog.
...
Рейтинг: 0 / 0
Не выполнять батчи, если не выполнилось условие
    #40092325
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Ну, зачем же так брутально. Есть проще способ: включаем SQLCMD и
Код: sql
1.
raiserror('batch termination', 16, 127);
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не выполнять батчи, если не выполнилось условие
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]