Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее / 4 сообщений из 4, страница 1 из 1
15.03.2021, 09:59
    #40053444
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
Добрый день!
Есть процедура с TRY ... CATCH внутри. При срабатывании CATCH заполняются 2 переменные (одна с кодом ошибки, другая с текстом), далее эти переменные возвращаются в виде таблицы. Но для того чтобы использовать данные, которые вернула процедура необходимо их записать во временную таблицу и при записи происходит ошибка
Код: sql
1.
2.
Msg 3930, Level 16, State 1, Line 15
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.



Код процедуры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
USE [SOMEBASE]
GO
/****** Object:  StoredProcedure [dbo].[some_proc]    Script Date: 11.03.2021 9:39:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[some_proc] 
as
begin

		declare @i int = 1,
				@result_code int = 1,
				@result_message nvarchar(max)
				
		begin try
			set @i = '4ryrtyrty1' -- спецальная ошибка для отработки catch
		end try
		begin catch
			set @result_code = -1 
			set @result_message = ERROR_MESSAGE() 

		end catch


	select @result_code as result_code, @result_message as result_message
	return 
end



Вызов процедуры с последующей обработкой таблицы, которая была возвращена:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @proc_name varchar(max) = N'[somebase].[dbo].[some_proc]'



if object_id('TMP_ProcResultTable') IS NOT NULL
	DROP TABLE TMP_ProcResultTable

create table TMP_ProcResultTable(
	result_code int,
	result_message nvarchar(max)
	)

insert TMP_ProcResultTable exec @proc_name  -- тут валится ошибка с транзакцией
select * from TMP_ProcResultTable



Если же не провоцировать ошибку, то код срабатывает без проблем, т.е. возвращается таблица с двумя полями, где в первом поле '1' и null во втором. Insert проходит без проблем.
Помогите разобраться что делаю не так?

Функцию сделать не получится, т.к. процедура в примере всего лишь показывает суть проблемы, на самом деле там большая процедура с инсертами...
...
Рейтинг: 0 / 0
15.03.2021, 10:25
    #40053449
Verbovsky Innokenty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
Может сделать так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ALTER procedure [dbo].[some_proc] 
	@result_code int = 1 OUTPUT,
	@result_message nvarchar(max) OUTPUT
as
begin
		declare @i int = 1

				
		begin try
			set @i = '4ryrtyrty1' -- спецальная ошибка для отработки catch
		end try
		begin catch
			set @result_code = -1 
			set @result_message = ERROR_MESSAGE() 

		end catch
	return 
end


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
if object_id('TMP_ProcResultTable') IS NOT NULL
	DROP TABLE TMP_ProcResultTable

create table TMP_ProcResultTable(
	result_code int,
	result_message nvarchar(max)
	)
DECLARE @result_code int = 1,
		@result_message nvarchar(max),
		@return_value int

EXEC @return_value = [dbo].[some_proc]
	@result_code = @result_code OUTPUT,
	@result_message = @result_message OUTPUT

insert TMP_ProcResultTable VALUES (@result_code, @result_message)
select * from TMP_ProcResultTable
...
Рейтинг: 0 / 0
15.03.2021, 11:05
    #40053470
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
ol_chig
Добрый день!
Есть процедура с TRY ... CATCH внутри. При срабатывании CATCH заполняются 2 переменные (одна с кодом ошибки, другая с текстом), далее эти переменные возвращаются в виде таблицы. Но для того чтобы использовать данные, которые вернула процедура необходимо их записать во временную таблицу и при записи происходит ошибка
Код: sql
1.
2.
Msg 3930, Level 16, State 1, Line 15
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.



Код процедуры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
USE [SOMEBASE]
GO
/****** Object:  StoredProcedure [dbo].[some_proc]    Script Date: 11.03.2021 9:39:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[some_proc] 
as
begin

		declare @i int = 1,
				@result_code int = 1,
				@result_message nvarchar(max)
				
		begin try
			set @i = '4ryrtyrty1' -- спецальная ошибка для отработки catch
		end try
		begin catch
			set @result_code = -1 
			set @result_message = ERROR_MESSAGE() 

		end catch


	select @result_code as result_code, @result_message as result_message
	return 
end



Вызов процедуры с последующей обработкой таблицы, которая была возвращена:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @proc_name varchar(max) = N'[somebase].[dbo].[some_proc]'



if object_id('TMP_ProcResultTable') IS NOT NULL
	DROP TABLE TMP_ProcResultTable

create table TMP_ProcResultTable(
	result_code int,
	result_message nvarchar(max)
	)

insert TMP_ProcResultTable exec @proc_name  -- тут валится ошибка с транзакцией
select * from TMP_ProcResultTable



Если же не провоцировать ошибку, то код срабатывает без проблем, т.е. возвращается таблица с двумя полями, где в первом поле '1' и null во втором. Insert проходит без проблем.
Помогите разобраться что делаю не так?

Функцию сделать не получится, т.к. процедура в примере всего лишь показывает суть проблемы, на самом деле там большая процедура с инсертами...


просцице за назойливость, а по чему вы спецальную провоцырующюю ошыбку обрабатываете таким образом

begin catch
set @result_code = -1
set @result_message = ERROR_MESSAGE()
end catch

ведь в место -1 можно вернуть что то осязаемое?
...
Рейтинг: 0 / 0
15.03.2021, 12:37
    #40053526
ol_chig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
Verbovsky Innokenty
Может сделать так?

получилось через output, спасибо
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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