Сабж. Как пользоваться поиском, и как получать OUTPUT-поля - знаю. Всё прекрасно работает, если out-параметр, например, varchar(8000). При varchar(max) всё это не работает. Пример процедуры:
CREATE procedure [dbo].[sp_foo](@bar varchar(max) output) as
begin
set @bar='';
select @bar=@bar+name from sys.all_objects;
end;
GO
Проверяем:
declare
@zot varchar(max)
exec [dbo].[sp_foo] @zot out
select @zot,LEN(@zot)
go
Вывод:
(No column name) (No column name)
sysrscolssysrowsetssysallocunitssysfiles1... 43390
Далее в delphi (использую RAD Studio 2010):
DMUnit.ConToLocal.Connected:=True;
with DMUnit.sp_foo do
begin
Connection:=DMUnit.ConToLocal;
ProcedureName:='sp_foo';
Parameters.Refresh;
Parameters.FindParam('@bar').Direction:=pdOutput;
ExecProc;
writeln('test done: '+IntToStr(Length(Parameters.FindParam('@bar').Value)));
end;
и получаю:
Project SPTest.exe raised exception class EOleException with message
'Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения.'
При замене в ХП varchar(max) на varchar(8000) все работает нормально, но varchar(8000) для требуемой задачи недостаточно. Исходя из того, что при varchar(max) данные предоставляются в виде потока, пытался сделать так:
var
StrStream: TStringStream;
AStream: TStreamAdapter;
begin
DMUnit.ConToLocal.Connected:=True;
StrStream := TStringStream.Create('');
AStream := TStreamAdapter.Create(StrStream);
with DMUnit.sp_foo do
begin
Connection:=DMUnit.ConToLocal;
ProcedureName:='sp_foo';
Parameters.Refresh;
Parameters.FindParam('@bar').Direction:=pdOutput;
Parameters.FindParam('@bar').Value:=IStream(AStream);
ExecProc;
writeln('test done');
end;
end;
Результат:
Project SPTest.exe raised exception class EOleException with message
'Приложение использует для текущей операции значение неверного типа.'
Пытался дополнительно указывать тип данных параметра, менять pdOutput на pdInputOutput - без толку.
Кто-нибудь сталкивался с подобным?