Непонятное поведение параметров в SDAC

AOleg
Дата: 16.10.2006 19:04:52
Имеем D7+SDAC+MS SQL 2000

На сервере есть ХП, начало которой выглядит примерно так:
автор
CREATE PROCEDURE bla-bla-bla
...
@dn int = 1000
AS
...


1. Если я вызываю эту процедуру из дельфи и, при этом, не устанавливаю параметр @dn, то в процедуре он не инициализируется так, как мне надо, т.е. в дальнейшем в процедуре он не равен 1000.
2. Если я запускаю эту же процедуру в среде MS SQL, то все срабатывает как требуется, причем независимо от того, где именно я её запускаю - в QA или из другой процедуры. (запускаю тоже не указывая этот параметр)

Пытался сразу же после выполнения процедуры вернуть значение @dn (сохранил его в другой переменной) - возвращает пустую строку.
softwarer
Дата: 16.10.2006 19:42:47
Думаю, дело в том, что при ручном запуске Вы запускаете процедуру, не указывая параметр, а при запуске через SDAC Вы запускаете, не инициализируя параметр. В результате чего запуск идет с указанием неинициализированного значения (Null скорее всего).
AOleg
Дата: 16.10.2006 19:52:44
автор
Думаю, дело в том, что при ручном запуске Вы запускаете процедуру, не указывая параметр, а при запуске через SDAC Вы запускаете, не инициализируя параметр. В результате чего запуск идет с указанием неинициализированного значения (Null скорее всего).


Я правильно понял, что если укажу перед запуском процедуры из дельфи

автор
sp.ParamByName('@dn').Value := ''


всё должно пройти нормально? (сейчас попробовать не могу). Или я неправильно понимаю понятия "инициализация" и "указание" параметра?

А в чем тогда смысл значений по умолчанию? С таким же успехом я могу в дельфи делать параметр := значение.
softwarer
Дата: 16.10.2006 20:30:07
AOleg
что если укажу перед запуском процедуры из дельфи .... всё должно пройти нормально?

Крайне сомневаюсь. Я не знаю MSSQL и SDAC, постараюсь описать в терминах Oracle.

Допустим, Вы делаете процедуру:

create procedure Dummy ( i integer default 10 ) is
begin
  dbms_output.put_line ( 'i = ' || i ) ;
end ;

Ее можно вызвать:

begin
  Dummy ( 20 ) ; -- результат 20
  Dummy ; -- результат 10
end ;

Проблема в том, что код генерации, находящийся в компоненте StoredProc, действует очень просто: идет по списку параметров и генерирует соответствующую часть вызова; например, для процедуры Dummy он сгенерирует

begin
  Dummy ( :i ) ;
end ;

Все. Начиная с этого момента, поскольку параметр явно указан, значение по умолчанию не используется. Для того, чтобы использовать значение по умолчанию, нужно удалить этот параметр из списка.

Конечно, хорошо бы, чтобы была более мягкая функциональность, возможность сказать параметру использовать значение по умолчанию. Для ODAC я такой возможности не нашел, поэтому полагаю, ее нет и в SDAC, и таки придется писать какой-нибудь DeleteParam.
AOleg
Дата: 16.10.2006 20:42:18
Понятно, спасибо.
завтра на работе попробую.
Андрей Спильный
Дата: 17.10.2006 11:28:55
насколько я помню, ADO ведет себя точно также, загружая список всех параметров для хранимки

softwarer
Для ODAC я такой возможности не нашел, поэтому полагаю, ее нет и в SDAC, и таки придется писать какой-нибудь DeleteParam.


как вариант, можно использовать TMSQuery вместо TMSStoredProc, и соответственно вызывать exec myproc