Size: a a a

SqlCom.ru - Стиль жизни SQL

2020 October 08

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
2flower _
в этом прелесть try catch,  если навороченной логики нет, этой конструкции в общем случае достаточно.
commit в конце try, rollback в catch.
"Прелесть" try catch в MS SQL описана, например, здесь: http://www.sommarskog.se/error_handling/Part1.html
(Мне искренне любопытно, как много программистов это читали/знают и обрабатывают ошибки правильно.)
источник

V

Vosin in SqlCom.ru - Стиль жизни SQL
2flower _
а что мешает сделать
with inserted as (
insert ...
)
update ...
сорри, это что-то новое в MSSQL подвезли?
я про
with inserted as (
insert ...
)
источник

2_

2flower _ in SqlCom.ru - Стиль жизни SQL
Yaroslav Schekin
"Прелесть" try catch в MS SQL описана, например, здесь: http://www.sommarskog.se/error_handling/Part1.html
(Мне искренне любопытно, как много программистов это читали/знают и обрабатывают ошибки правильно.)
чтиво очень большое с множеством кейсов, может конкретно сказать, что я не так написал?
да, я знаю что надо откатывать транзакцию с проверкой.
но я не понимаю, если первая команда в try begin transaction, как в catch может попасть @@trancount=0 при условии что в try блоке не было отката?
и текст процедуры корректный.
Т.е. не этот кейс с "Invalid object name 'NoSuchTable'"
источник

2_

2flower _ in SqlCom.ru - Стиль жизни SQL
Vosin
сорри, это что-то новое в MSSQL подвезли?
я про
with inserted as (
insert ...
)
да вроде нет, я пока еще старовер.
А что вас смутило в конструкции? cte вроде как давно завезли
источник

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
2flower _
чтиво очень большое с множеством кейсов, может конкретно сказать, что я не так написал?
да, я знаю что надо откатывать транзакцию с проверкой.
но я не понимаю, если первая команда в try begin transaction, как в catch может попасть @@trancount=0 при условии что в try блоке не было отката?
и текст процедуры корректный.
Т.е. не этот кейс с "Invalid object name 'NoSuchTable'"
А вот SQL Server "понимает", и когда это случится, ошибка будет обработана неправильно.
Я к тому, что Ваше непонимание реальности не меняет, и каждая строка в примере:
CREATE PROCEDURE insert_data @a int, @b int AS 
  SET XACT_ABORT, NOCOUNT ON
  BEGIN TRY
     BEGIN TRANSACTION
     INSERT sometable(a, b) VALUES (@a, @b)
     INSERT sometable(a, b) VALUES (@b, @a)
     COMMIT TRANSACTION
  END TRY
  BEGIN CATCH
     IF @@trancount > 0 ROLLBACK TRANSACTION
     DECLARE @msg nvarchar(2048) = error_message()  
     RAISERROR (@msg, 16, 1)
     RETURN 55555
  END CATCH

там не просто так. ;)
источник

V

Vosin in SqlCom.ru - Стиль жизни SQL
2flower _
да вроде нет, я пока еще старовер.
А что вас смутило в конструкции? cte вроде как давно завезли
cte над insert смутило
with inserted as (
insert ...
)
источник

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
2flower _
да вроде нет, я пока еще старовер.
А что вас смутило в конструкции? cte вроде как давно завезли
То, что MS SQL её никогда не поддерживал (и не поддерживает), может быть?
Вы чат не перепутали? ;)
источник

2_

2flower _ in SqlCom.ru - Стиль жизни SQL
Yaroslav Schekin
А вот SQL Server "понимает", и когда это случится, ошибка будет обработана неправильно.
Я к тому, что Ваше непонимание реальности не меняет, и каждая строка в примере:
CREATE PROCEDURE insert_data @a int, @b int AS 
  SET XACT_ABORT, NOCOUNT ON
  BEGIN TRY
     BEGIN TRANSACTION
     INSERT sometable(a, b) VALUES (@a, @b)
     INSERT sometable(a, b) VALUES (@b, @a)
     COMMIT TRANSACTION
  END TRY
  BEGIN CATCH
     IF @@trancount > 0 ROLLBACK TRANSACTION
     DECLARE @msg nvarchar(2048) = error_message()  
     RAISERROR (@msg, 16, 1)
     RETURN 55555
  END CATCH

там не просто так. ;)
я просто хочу разобраться, я с вами не спорю.
Everything else in the procedure should come after BEGIN TRY: variable declarations, creation of temp tables, table variables, everything. Even if you have other SET commands in the procedure (there is rarely a reason for this, though), they should come after BEGIN TRY.
вот это я практически никогда не делал...

а с примером так и не понял, в статье будет ошибка или на первом или на втором insert'е.
транзакция открыта в обоих случаях, когда будет ситуация с @@trancount=0 так и не увидел.
я понимаю, что в примере надо читать каждую строку, но видимо за деревьями леса не вижу.
источник

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
2flower _
я просто хочу разобраться, я с вами не спорю.
Everything else in the procedure should come after BEGIN TRY: variable declarations, creation of temp tables, table variables, everything. Even if you have other SET commands in the procedure (there is rarely a reason for this, though), they should come after BEGIN TRY.
вот это я практически никогда не делал...

а с примером так и не понял, в статье будет ошибка или на первом или на втором insert'е.
транзакция открыта в обоих случаях, когда будет ситуация с @@trancount=0 так и не увидел.
я понимаю, что в примере надо читать каждую строку, но видимо за деревьями леса не вижу.
Это же только первая часть статьи — для тех, кто хочет примеров / разобраться, там есть продолжение.
источник

2_

2flower _ in SqlCom.ru - Стиль жизни SQL
Yaroslav Schekin
Это же только первая часть статьи — для тех, кто хочет примеров / разобраться, там есть продолжение.
спасибо, посмотрю обязательно.
источник

2_

2flower _ in SqlCom.ru - Стиль жизни SQL
Yaroslav Schekin
То, что MS SQL её никогда не поддерживал (и не поддерживает), может быть?
Вы чат не перепутали? ;)
хм... вы правы... а слона то я и не заметил... :)

тогда ход конем
create table tbl_header(id int);
create table tbl_detail(header int,id int)

insert into tbl_detail(header,id)
select id,5 from
(
insert into tbl_header(id)
 OUTPUT INSERTED.id
 values(2)
 ) as t;
 
select header,id from tbl_detail;

так работает.
источник

А

Андрій in SqlCom.ru - Стиль жизни SQL
Yaroslav Schekin
То, что MS SQL её никогда не поддерживал (и не поддерживает), может быть?
Вы чат не перепутали? ;)
так а кто поддерживает?
источник

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
Андрій
так а кто поддерживает?
PostgreSQL, например.
источник

II

Igor Ivakhin in SqlCom.ru - Стиль жизни SQL
Ребят подскажите пожалуйста куда копать:
Есть один запрос, который в одинаковых условиях выполняется либо довольно быстро, либо зависает в cxconsumer, не могу понять, почему это по разному происходит, от чего это зав-т неужто план запроса раз в какое то время рисуется кривым?
источник

T

Timus in SqlCom.ru - Стиль жизни SQL
а ты знаешь, что свое сообщение можно редактировать?)
источник

II

Igor Ivakhin in SqlCom.ru - Стиль жизни SQL
Отредачил) простите)
источник

g

greeninsania in SqlCom.ru - Стиль жизни SQL
Я в таких случаях параллелизм отключал или уменьшал через maxdop. В 2 из 3 случаях помогло)
источник

II

Igor Ivakhin in SqlCom.ru - Стиль жизни SQL
Но при это те быстрые случае станут медленее, верно?
источник

M

Marat in SqlCom.ru - Стиль жизни SQL
Igor Ivakhin
Но при это те быстрые случае станут медленее, верно?
покажите запрос и планы, там видно будет
источник

II

Igor Ivakhin in SqlCom.ru - Стиль жизни SQL
Не уверен, что планы которые я симулировал руками истинные) ибо когда я сам смотрю все выполняется нормально... когда через джоб, то раз через раз зависание
источник