Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Запрос или хранимая процедура - получить выходной параметр (число прочтений - 3632 )
selesta
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 26. Июня 2012
Запрос или хранимая процедура - получить выходной параметр
26. Июня 2012 :: 11:43
Печать  
Добрый день.

Помогите достать выходной параметр из ХП.
Перечитал все что мог - не получается.
Текст процедуры:
Код
Выбрать все
USE [oktell]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
ALTER PROCEDURE [dbo].[_custom_PathToRecord]
	@id uniqueidentifier,
	@result nvarchar(500) OUTPUT
AS
BEGIN
	SET NOCOUNT ON;

	declare @aln nvarchar(10)
	declare @bln nvarchar(10)
	declare @idrecdir int
	declare @ts nvarchar(50)
	declare @path nvarchar(1000)
	declare @filename nvarchar(1000)

	select top 1 @aln=case when alinenum>blinenum then blinenum else alinenum end, @bln=case when blinenum>alinenum then blinenum else alinenum end, @idrecdir=idrecdir, @ts=replace(convert(nvarchar(10), TimeStart, 121), '-', '_')+'__'+replace(convert(nvarchar(20), TimeStart, 114), ':', '_') from [oktell].[dbo].[A_Stat_Connections_1x1]
	where cast (Id as varchar(36))=@id and isrecorded=1

	set @path='C:\Program Files\oktell\Server\RecordedFiles'
	if (@idrecdir>0)
	select @path=path from [oktell_settings].[dbo].[A_Stat_RecordDirectories] where id=@idrecdir

	set @filename=@path+replace(substring(@ts, 1, 10), '_', '')+''+substring(@ts, 13, 2)+substring(@ts, 16, 2)+'\mix_'+@aln+'_'+@bln+'__'+@ts+'.wav'
	set @result=@filename

END 



в Студии запрос
Код
Выбрать все
Use oktell
Declare @Result nvarchar(1000)
Declare @id uniqueidentifier
set @id = convert(uniqueidentifier, '27795F41-E3BE-42A6-BBE5-34F48602459F')
exec dbo._custom_PathToRecord @id ,@Result Output
select @Result as Result 


выдает результат - D:\Records\201206171133\mix_13030_17011__2012_06_17__11_33_40_467.wav

таким запросом из 1с я получаю нужный результат в виде строки ТЗ, но этот как временное решение:
Код
Выбрать все
		ТекстЗапроса = "
			|Declare @answer nvarchar(1000)
			|Declare @id uniqueidentifier
			|set @id = convert(uniqueidentifier, '27795F41-E3BE-42A6-BBE5-34F48602459F')
			|exec dbo._custom_PathToRecord @id, @answer Output
			|select @answer as Result
			|";


Recordset_Oktell.Подготовить(ТекстЗапроса);		тз=Recordset_Oktell.ВыполнитьИнструкцию(ТекстЗапроса,тз);
тз.ВыбратьСтроку();
 



а вот как получить выходной параметр через ДобПараметр(2 - не знаю
перепробовал все возможные варианты - всегда на выходе количество параметров 0

с этим сталкиваюсь 2-3 раз - прошу не пинать
Спасибо
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос или хранимая процедура - получить выходной параметр
Ответ #1 - 26. Июня 2012 :: 12:08
Печать  
Код
Выбрать все
рс = СоздатьОбъект("ODBCRecordset");
рс.ДобПараметр(2, 15, 500, 0);
рс.Подготовить("{CALL _custom_PathToRecord('27795F41-E3BE-42A6-BBE5-34F48602459F', ?)}");
рс.ВыполнитьИнструкцию();
Результат = рс.ПолучПараметр(1);
Сообщить(Результат); 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос или хранимая процедура - получить выходной параметр
Ответ #2 - 26. Июня 2012 :: 12:10
Печать  
а может так сделать
преобразование
set @id = convert(uniqueidentifier, '27795F41-E3BE-42A6-BBE5-34F48602459F')
поместить внутрь xp
и результат  выдавать в виде select
а не в виде sql переменной ?
  
Наверх
 
IP записан
 
selesta
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 26. Июня 2012
Re: Запрос или хранимая процедура - получить выходной параметр
Ответ #3 - 26. Июня 2012 :: 12:52
Печать  
спасибо за ответы, получилось и так и так
в итоге сейчас остановился на таком:
Код
Выбрать все
Процедура ИмяФайла()
		ТекстЗапроса = "{CALL _custom_PathToRecord (?,?)}";
		Recordset_Oktell.Подготовить(ТекстЗапроса);
		Recordset_Oktell.ДобПараметр(1,15,36,0);
		Recordset_Oktell.ДобПараметр(2,15,500,0);
		Recordset_Oktell.УстПараметр(1,"27795F41-E3BE-42A6-BBE5-34F48602459F");
		тз=Recordset_Oktell.ВыполнитьИнструкцию();
		Сообщить("На выходе 1 = "+Recordset_Oktell.ПолучПараметр(1));
		Сообщить("На выходе 2 = "+Recordset_Oktell.ПолучПараметр(2));
КонецПроцедуры
 



В хранимой:
Код
Выбрать все
USE [oktell]
GO
/****** Object:  StoredProcedure [dbo].[_custom_PathToRecord]    Script Date: 06/26/2012 11:27:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
ALTER PROCEDURE [dbo].[_custom_PathToRecord]
	@id_as_char nvarchar(36),
	@result nvarchar(500) OUTPUT
AS
BEGIN
	SET NOCOUNT ON;

	declare @aln nvarchar(10)
	declare @bln nvarchar(10)
	declare @idrecdir int
	declare @ts nvarchar(50)
	declare @path nvarchar(1000)
	declare @filename nvarchar(1000)
	declare @id uniqueidentifier

set @id = convert(uniqueidentifier,@id_as_char)

	select top 1 @aln=case when alinenum>blinenum then blinenum else alinenum end, @bln=case when blinenum>alinenum then blinenum else alinenum end, @idrecdir=idrecdir, @ts=replace(convert(nvarchar(10), TimeStart, 121), '-', '_')+'__'+replace(convert(nvarchar(20), TimeStart, 114), ':', '_') from [oktell].[dbo].[A_Stat_Connections_1x1]
	where cast (Id as varchar(36))=@id and isrecorded=1

	set @path='C:\Program Files\oktell\Server\RecordedFiles'
	if (@idrecdir>0)
	select @path=path from [oktell_settings].[dbo].[A_Stat_RecordDirectories] where id=@idrecdir

	set @filename=@path+replace(substring(@ts, 1, 10), '_', '')+''+substring(@ts, 13, 2)+substring(@ts, 16, 2)+'\mix_'+@aln+'_'+@bln+'__'+@ts+'.wav'
	set @result = @filename

END
 



Получаю:
Код
Выбрать все
На выходе 1 = 27795F41-E3BE-42A6-BBE5-34F48602459F
На выходе 2 = D:\Records\201206171133\mix_13030_17011__2012_06_17__11_33_40_467.wav
 



Вобщем-то могу просто брать 2й параметр, но не пойму почему появляется первый? он же не OUTPUT, что лишнее?
Жаль, в коде не могу подсветить изменения - теги не работают

Спасибо
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос или хранимая процедура - получить выходной параметр
Ответ #4 - 26. Июня 2012 :: 13:13
Печать  
selesta писал(а) 26. Июня 2012 :: 12:52:
Вобщем-то могу просто брать 2й параметр, но не пойму почему появляется первый? он же не OUTPUT, что лишнее?


Может, он просто не очищается? Посмотри реализацию методов в исходниках 1С++. Или выброси добавление параметра:
Код
Выбрать все
Процедура ИмяФайла()
	Recordset_Oktell.УстановитьТекстовыйПараметр("Гуид", "27795F41-E3BE-42A6-BBE5-34F48602459F");
	Recordset_Oktell.ДобПараметр(2, 15, 500, 0);
	ТекстЗапроса = "{CALL _custom_PathToRecord(:Гуид, ?)}";
	Recordset_Oktell.Подготовить(ТекстЗапроса);
	Recordset_Oktell.ВыполнитьИнструкцию();
	Сообщить("На выходе = "+Recordset_Oktell.ПолучПараметр(1));
КонецПроцедуры 


  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
selesta
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 26. Июня 2012
Re: Запрос или хранимая процедура - получить выходной параметр
Ответ #5 - 26. Июня 2012 :: 13:27
Печать  
так работает и возвращает 1 параметр
но выполнение запроса работает ровно через раз
1 раз есть ответ, а второй раз
State 07002, native 0, message [Microsoft][ODBC SQL Server Driver]Неправильное поле COUNT или ошибка синтаксиса
и так по кругу

может надо счетчик как-то выключить либо выборку каждый раз открывать\закрывать?

насчет исходников весело сказано - говорю же первый раз залез в такие дебри, чайник я в сиквеле, тем более в исходниках ковыряться
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос или хранимая процедура - получить выходной параметр
Ответ #6 - 26. Июня 2012 :: 13:33
Печать  
selesta писал(а) 26. Июня 2012 :: 13:27:
так работает и возвращает 1 параметр
но выполнение запроса работает ровно через раз
1 раз есть ответ, а второй раз
State 07002, native 0, message [Microsoft][ODBC SQL Server Driver]Неправильное поле COUNT или ошибка синтаксиса

У тебя Recordset_Oktell - глобальный. Или вынеси из процедуры добавление параметра и подготовку запроса (это надо делать 1 раз) или пересоздавай каждый раз Recordset_Oktell внутри процедуры.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
selesta
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 26. Июня 2012
Re: Запрос или хранимая процедура - получить выходной параметр
Ответ #7 - 26. Июня 2012 :: 13:57
Печать  
Спасибо большое!
Достижений тебе и успехов всем, кто зайдет в эту тему с аналогичным вопросом))
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать