Получить единственное значение из SQL

1. user949421 23.10.18 09:47 Сейчас в теме
Необходимо из 1С 8.2 подключится к MS SQL и выполнить следующий код:
declare @num_id int
exec @num_id = [RT].[UD_INT_CREATE_] 'Some string', 'E', 200, 'Some string'
Как видно, из SQL возвращается одно единственное число.
Как это реализовать?.
Когда нужно было из SQL получать таблицу, использовал код (см. ниже)
Но в данном случае код не работает. Появляется ошибка:
{ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Форма(98)}: Ошибка при получении значения атрибута контекста (EOF): Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.

Код:
	RS = Новый COMОбъект ("ADODB.RecordSet");
	RS.CursorLocation = 2;
	RS.CursorType = 0;
	RS.LockType = 1;
	sql =  "
	|declare @num_id int
	|EXECUTE @num_id = [RT].[UD_INT_CREATE_] 'Some string', 'E', 200, 'Some string' ";

	RS = Conn.Execute(sql);
	Для каждого Поле ИЗ  RS.Fields Цикл
		Попытка
			ТЗ_результат.Колонки.Добавить(Поле.Name , , );
		Исключение
			ТЗ_результат.Колонки.Добавить("Поле" + Строка(ТЗ_результат.Колонки.Количество()+1) , , Поле.Name);
		КонецПопытки;
	КонецЦикла;				
			
	Пока НЕ (RS.EOF) Цикл
		стр_ТЗ_результат = ТЗ_результат.Добавить();
		сч_полей = 0;
		Для каждого Поле ИЗ  RS.Fields Цикл
				сч_полей = сч_полей + 1;
				Попытка
					стр_ТЗ_результат[RS.Fields(сч_полей-1).Name] = RS.Fields(сч_полей-1).Value;
				Исключение
					стр_ТЗ_результат["Поле" + Строка(сч_полей)] = RS.Fields(сч_полей-1).Value;
				КонецПопытки;
			КонецЦикла;				
		RS.MoveNext();
			
	КонецЦикла;

	RS.Close();
	Conn.Close();
Показать

Как в 1с реализовать получение одного значения из SQL?
По теме из базы знаний
Найденные решения
5. SanyMaga 70 23.10.18 11:01 Сейчас в теме
а как же SELECT??

declare @num_id int
EXECUTE @num_id = [RT].[UD_INT_CREATE_] 'Some string', 'E', 200, 'Some string' ";
select @num_id

проверка:

declare @num_id int
SET @num_id = 100
select @num_id

Обработка
7. iliya2009 23.10.18 11:38 Сейчас в теме
Добрый день!

А может попробовать так:

RS = Новый COMОбъект("ADODB.Recordset");	
RS.Open(ТекстЗапроса, Connection, 3);

Пока RS.EOF() = 0 Цикл
...
	RS.MoveNext();
КонецЦикла;
RS.Close();


Тоже только с запросами так работаем.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. ediks 337 23.10.18 10:00 Сейчас в теме
(1) Как Вам правильно заметили, необходимо подключить базу
	
Попытка
		Соединение = Новый COMОбъект("ADODB.Connection");          
		Соединение.Open("Provider=SQLOLEDB.1; Persist Security Info=false;
							|Data Source=" + Сервер +";
							|User ID=" + Пользователь +";
							|Password=" + Пароль + ";" + 
							?(ЗначениеЗаполнено(База), " Initial Catalog=" + База + ";",""));
	Исключение
		Для каждого Ошибка Из Соединение.Errors Цикл
			Сообщить("Ошибка " + Ошибка.nativeError + ": " + Ошибка.Description);
		КонецЦикла; 
		Соединение = Неопределено;
	КонецПопытки;
Показать
4. user949421 23.10.18 10:17 Сейчас в теме
Соединение c SQL установлено.
До строки
RS = Conn.Execute(sql);
есть конечно же код указанный в (3)
Проблема в обработке полученных данных
2. YannikAlx 28 23.10.18 09:54 Сейчас в теме
Так вы ОТКРОЙТЕ объект-то!
Он же у вас ни одной строкой вашей программы нге открывается...
5. SanyMaga 70 23.10.18 11:01 Сейчас в теме
а как же SELECT??

declare @num_id int
EXECUTE @num_id = [RT].[UD_INT_CREATE_] 'Some string', 'E', 200, 'Some string' ";
select @num_id

проверка:

declare @num_id int
SET @num_id = 100
select @num_id

Обработка
6. user949421 23.10.18 11:25 Сейчас в теме
Пробовал и такой вариант.
В 1с ничего не меняется, возникает та же ошибка.

Если запустить в студии
declare @num_id int
EXECUTE @num_id = [RT].[UD_INT_CREATE_] 'Some string', 'E', 200, 'Some string' ";
то результат выполнения будет :
Commands completed successfully.

А если выполнить
declare @num_id int
EXECUTE @num_id = [RT].[UD_INT_CREATE_] 'Some string', 'E', 200, 'Some string' ";
select @num_id
то результатом будет таблица с одной строкой и одним столбцом.
Но повторю, в 1с возникает та же ошибка.
7. iliya2009 23.10.18 11:38 Сейчас в теме
Добрый день!

А может попробовать так:

RS = Новый COMОбъект("ADODB.Recordset");	
RS.Open(ТекстЗапроса, Connection, 3);

Пока RS.EOF() = 0 Цикл
...
	RS.MoveNext();
КонецЦикла;
RS.Close();


Тоже только с запросами так работаем.
8. iliya2009 23.10.18 11:39 Сейчас в теме
9. user949421 23.10.18 14:59 Сейчас в теме
Спасибо 5,7.
В итоге заработало когда исправил запрос к SQL на

set nocount on;
declare @num_id int
exec @num_id = [RT].[UD_INT_CREATE_] 'Some string', 'E', 200, 'Some string'
select @num_id as num_id

В этом случае заработал и мой вариант обработки через
RS = Conn.Execute(sql);
но и вариант RS.Open(ТекстЗапроса, Connection, 3); тоже работает
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот