Уважаемый ALL!
Столкнулся с неожиданным (для меня) поведением ADODB.Command
ADO - 2.7, MS SQL2k EE 3SP
есть таблица
CREATE TABLE _t (ID INT NOT NULL PRIMARY KEY, Value VARCHAR(20))
INSERT INTO _t
SELECT 1, '1' UNION ALL SELECT 2, '2' UNION ALL
SELECT 3, '3' UNION ALL SELECT 4, '4' |
|
процедура:
CREATE PROCEDURE sp_ChangeTable(@ID INT OUTPUT, @Value VACHAR(20))
AS
SET NOCOUNT ON
IF @ID IS NULL BEGIN
SELECT @ID = ISNULL(MAX(ID), 0)+1 FROM _t
INSERT INTO _t VALUES (@ID, @Value)
END ELSE BEGIN
UPDATE _t SET Value = @Value WHERE ID = @ID
END
SET NOCOUNT OFF
GO |
|
Вызывая эту процедуру из QA - получаю то, что хочу (добавление при @ID =NULL и изменение в противном случае).
Пытаюсь использовать для запуска SP ADODB.Command (Delphi):
vID := 5;
vV := 'Test';
FCmd.CommandType := adCmdStoredProc;
FCmd.CommandText := 'sp_ChangeTable';
Param := FCmd.CreateParameter('@ID', adInteger, adParamInputOutput, 0, vID);
FCmd.Parameters.Append(Param);
Param := FCmd.CreateParameter('@Value', adVarChar, adParamInput, 50, vV);
FCmd.Parameters.Append(Param);
FCmd.Execute(VarRecsAffected, v, 0); |
|
Для случая @ID=NULL получаю правильное поведение и несколько странный трэйс:
declare @P1 int
set @P1=5
exec sp_ ChangeTable @P1 output, 'Test'
select @P1 |
|
Для случая @ID=5 (такая запись в табл. есть) получаю добавление следующей записи и трэйс:
declare @P1 int
set @P1=6
exec sp_ ChangeTable @P1 output, 'Test'
select @P1 |
|
Я что-то неправильно делаю?
Спасибо.