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

Откуда: Кемерово, Томск
Сообщений: 27
Добрый день. Привожу примерный кусок кода, который генерируется программой динамически.

BEGIN TRANSACTION
DECLARE @_id_branch INT
SELECT @_id_branch = 57

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[zfinoper]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
truncate table [dbo].[zfinoper]
GO

SET IDENTITY_INSERT zfinoper ON 
INSERT INTO zfinoper(поля)
	SELECT поля FROM zfinoper_for_Export where ID_BRANCH = @_id_branch
SET IDENTITY_INSERT zfinoper OFF 

IF @@ERROR != 0 GOTO EndWithRollBack
IF @@TRANCOUNT != 0 COMMIT TRANSACTION
...

Загвоздка вот в чём: когда дело доходит до инсёрта, выдаётся сообщение "Must declare the variable '@_id_branch'". Просмотрев SQL-профайлер, выяснила, что несмотря на то, что операции truncate и insert выполняются в единой транзакции, в профайлере они идут двумя отдельными строками (2 отдельных события SQL:BatchCompleted). Экспериментальным путём установила, что если убрать "GO" после транкейта, скрипт отрабатывает нормально.
Вопрос такой: если я уберу "GO", то выполнится ли гарантировано truncate до insert'а? Не возникнет ли у меня ситуации, когда insert вызовет ошибку из-за попытки вставить неуникальный индекс, т.к. фактически транкейт ещё не выполнен?
29 дек 09, 13:21    [8132112]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
не понимаю смысла truncate в транзакции.
так же странно видеть if exists ( - в следующем предложении никаких сомнений нет
29 дек 09, 13:25    [8132143]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
GO - разделитель батчей в MSSMS. Соответственно после го не декларованы переменные
29 дек 09, 13:30    [8132185]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
zhenya17
Member

Откуда: Кемерово, Томск
Сообщений: 27
Зайцев Фёдор
не понимаю смысла truncate в транзакции.
Если коротко, то скрипт генерируется автоматически в одной из программ, в которой есть центральные и подчинённые базы. В этом ПО есть справочники, которые должны точь-в-точь совпадать с центральной базой. Поэтому чтобы сильно не напрягаться с сопоставлением таких справочников, проще просто их очистить и залить в них нужные данные.

Зайцев Фёдор
так же странно видеть if exists ( - в следующем предложении никаких сомнений нет
Что именно странно? Что стоит проверка на существование таблицы перед её транкейтом? Или имеете ввиду, что внутри транзакии эта проверка смысла не имеет?

И есть ли ответ по-существу, а не вопросы? :)
29 дек 09, 13:33    [8132210]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
zhenya17
Member

Откуда: Кемерово, Томск
Сообщений: 27
Ken@t
GO - разделитель батчей в MSSMS. Соответственно после го не декларованы переменные
Экспериментальным путём я это и поняла. Убрать "GO" в скрипте труда не составляет, но я пытаюсь подумать о последствиях, потому и задаю вопрос: гарантированно ли перед инсёртом будет выполнен транкейт?
29 дек 09, 13:35    [8132221]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
_djХомяГ
Guest
100 пудово)))
29 дек 09, 13:36    [8132232]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
zhenya17
Member

Откуда: Кемерово, Томск
Сообщений: 27
_djХомяГ
100 пудово)))
Простите, но мнению гостя довериться сложно :)
29 дек 09, 13:38    [8132260]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
_djХомяГ
Guest
а собственной логике доверится? )))
29 дек 09, 13:41    [8132292]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
zhenya17
_djХомяГ
100 пудово)))
Простите, но мнению гостя довериться сложно :)
асинхронно выполняются только джобы.
29 дек 09, 13:41    [8132295]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
zhenya17
Member

Откуда: Кемерово, Томск
Сообщений: 27
_djХомяГ
а собственной логике доверится? )))
А Вы доверяете женской логике?.. Зря!

Ну а так не знаю... хочется, чтобы транкейт был учтён до инсёрта, с другой стороны, пока транзакция не закончена в базе изменений не происходит. Похоже, проще проверить также эеспериментальным путём, чем гадать.
29 дек 09, 13:43    [8132320]     Ответить | Цитировать Сообщить модератору
 Re: Использование переменных в транзации  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31166
zhenya17
гарантированно ли перед инсёртом будет выполнен транкейт?
Нет, не гарантированно.
29 дек 09, 17:11    [8134152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить