Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 sp_executesql и транзакции  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
Граждане, волею случая вынужден конструировать запрос вида

declare @sql varchar(max), @dt datetime
select @date_min = min(datestamp), @date_max = max(datestamp)
from @TableName

while @date_min <= @date_max
begin
блаблабла
set @date_min = @date_min + 30
end'

set @execSQL = @otherDB + '.dbo.sp_executesql'
exec @execSQL @str


Цель - подрезать вражескую таблицу в соседней базе. Поскольку таблица огромная, подрезание поделено на части, чтобы лог не пух (база в режиме simple). Но тут задался вопросом - а не будет ли запуск sp_execiteSQL оборачивать все внутри в транзакцию таки? проверил - вроде нет, но какие-то сомнения гложут, поскольку лог при выполнении конструкции все равно растет довольно активно. Может - ставить delay в цикле, чтобы лог успевал подрезаться? Или таки вынести цикл за рамки процедуры?
Сильно менять чего-то не хочется, так как скрипт находится в режиме "работает - не трогай".
27 июл 09, 11:18    [7462675]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
BootMaker
Но тут задался вопросом - а не будет ли запуск sp_execiteSQL оборачивать все внутри в транзакцию таки? проверил - вроде нет, но какие-то сомнения гложут,

Откуда вообще возникла идея, что сервер должен выполнять запуск процедуры в транзакции ?
27 июл 09, 11:20    [7462695]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и транзакции  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
Glory
BootMaker
Но тут задался вопросом - а не будет ли запуск sp_execiteSQL оборачивать все внутри в транзакцию таки? проверил - вроде нет, но какие-то сомнения гложут,

Откуда вообще возникла идея, что сервер должен выполнять запуск процедуры в транзакции ?


Динамический запрос + отдельный скоп + программерская паранойя. Ну и вдруг там set implicit transaction какой-то стоит .Да, не должно быть такого по науке, но если я вдруг что-то не учел, цена ошибки будет высока (наши клиенты любят экономить места на дисках).
Как кстати мысль ставить в цикле задержку, чтобы симпл лог успел подрезаться? Имеет смысл?
27 июл 09, 11:37    [7462868]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
При set implicit транзакция не активируется командой execute.
Динамический запрос и отдельная область видимости тоже не активируют транзакции
Т.е. налицо явная "паранойя".
27 июл 09, 11:44    [7462923]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и транзакции  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
Glory
При set implicit транзакция не активируется командой execute.
Динамический запрос и отдельная область видимости тоже не активируют транзакции
Т.е. налицо явная "паранойя".



Ай, блин, не совсе корректно указал код.

declare @str varchar(max)
set @str = 'select @date_min = min(datestamp), @date_max = max(datestamp)
from @TableName

while @date_min <= @date_max
begin
блаблабла
set @date_min = @date_min + 30
end'

set @execSQL = @otherDB + '.dbo.sp_executesql'
exec @execSQL @str

т.е. сам цикл создается внутри передаваемой динамеской строки.
27 июл 09, 11:51    [7462983]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну казалось бы, чего проще для проверки написать

SET IMPLICIT_TRANSACTIONS on
go
declare @str nvarchar(4000), @execSQL nvarchar(4000)
set @str = 'print @@trancount'

set @execSQL = 'tempdb' + '.dbo.sp_executesql'
exec @execSQL @str
27 июл 09, 12:02    [7463081]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и транзакции  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
А вот например
SET IMPLICIT_TRANSACTIONS on
go
declare @str nvarchar(4000), @execSQL nvarchar(4000)
set @str = 'declare @min bigint
select @min = min(object_id) from sys.objects
print @@trancount'

set @execSQL = 'tempdb' + '.dbo.sp_executesql'
exec @execSQL @str
уже включается :)
27 июл 09, 13:31    [7463887]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
BootMaker
А вот например
SET IMPLICIT_TRANSACTIONS on
go
declare @str nvarchar(4000), @execSQL nvarchar(4000)
set @str = 'declare @min bigint
select @min = min(object_id) from sys.objects
print @@trancount'

set @execSQL = 'tempdb' + '.dbo.sp_executesql'
exec @execSQL @str
уже включается :)

Вы читали вообще статью в хелпе про SET IMPLICIT_TRANSACTIONS ? Видели там список команд, которые запускают транзакцию ?
27 июл 09, 13:33    [7463916]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить