powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
4 сообщений из 4, страница 1 из 1
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
    #40053444
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 проходит без проблем.
Помогите разобраться что делаю не так?

Функцию сделать не получится, т.к. процедура в примере всего лишь показывает суть проблемы, на самом деле там большая процедура с инсертами...
...
Рейтинг: 0 / 0
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
    #40053449
Verbovsky Innokenty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может сделать так?
Код: 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
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
    #40053470
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Попытка забрать из процедуры таблицу или как правильно забрать 2 переменные из нее
    #40053526
ol_chig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Verbovsky Innokenty
Может сделать так?

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


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