Объясните, пожалуйста, как всё-таки правильно выполнять хранимый процедуры MS SQL Server (в данном случае 2008)
Есть ХП:
ALTER PROCEDURE [dbo].[p_AgetsUpdateRows]
@id char(9),
@name char(100),
@code char(10),
@parent char(9) = NULL
AS
BEGIN
SET NOCOUNT ON;
if @parent = ' 0 ' begin SET @parent = null end
UPDATE dbo.Agents
SET Name = @name, Code = @code, Parent = @parent where ID = @id
if @@ROWCOUNT = 0
begin
insert into dbo.Agents (ID, Code, Name, Parent)
values (@id, @code, @name, @parent)
end
END
Выполняю в 1С:
зАгент = НовыйЗапрос();//обновление агентов
зАгент.ДобПараметр(1, 14,9,0);
зАгент.ДобПараметр(1, 14,100,0);
зАгент.ДобПараметр(1, 14,10,0);
зАгент.ДобПараметр(1, 14,9,0);
зАгент.Подготовить("{call p_AgetsUpdateRows (?,?,?,?)}");
//---
зАгент.УстПараметр(1, вхАгент);
зАгент.УстПараметр(2, вхАгент.Наименование);
зАгент.УстПараметр(3, вхАгент.Код);
зАгент.УстПараметр(4, вхАгент.Родитель);
Так работает, но есть много неудобств:
1. При добавлении параметров методом "ДобПараметр" надо постоянно прыгать из окна 1С в Студию МС
2. При установке параметров методом "УстПараметр" надо обязательно смотреть что означал параметр под номером 1, 2... - т.е. опять прыгать
3. В 1sqlite, например, можно задавать именованые параметры:
Цитата:SQL параметры это параметры для параметризированного запроса. В тексте запроса они обозначаются следующими способами:
? - неименованный параметр, установка возможна только по индексу.
?Число - неименованный параметр, установка возможна по индексу Число.
$ИмяПараметра или @ИмяПараметра - именованный параметр, установка возможна по имени.
в документации к ODBCRecordset я такого не нашел.
самый удобный способ, как мне кажется, такой:
ТекстЗапроса = "
|EXEC [dbo].[p_AgetsUpdateRows]
|@id = :Агент,
|@name = :Наименование,
|@code = :Код,
|@Parent = :Родитель";
Запрос.УстановитьТекстовыйПараметр("Агент", вхАгент);
Запрос.УстановитьТекстовыйПараметр("Наименование", вхАгент.Наименование);
Запрос.УстановитьТекстовыйПараметр("Код", вхАгент.Код);
Запрос.УстановитьТекстовыйПараметр("Родитель", вхАгент.Родитель);
//Запрос.Отладка(1);
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Не удалось вставить агента: "+вхАгент+" по причине:","!");
Сообщить(Запрос.ПолучитьОписаниеОшибки(),"!");
Возврат 0;
КонецЕсли;
Но таким способом можно задавать только текстовые значения. Опять-таки в 1sqlite намного удобнее. Там вместо "УстановитьТекстовыйПараметр" есть метод "Подставлять", который именно ПОДСТАВЛЯЕТ заданное значение в параметр, а не передает его как текст. upd Извиняюсь, был неправ.
Уважаемые знатоки, подскажите как делаете вы. И что я пропустил при изучении данного вопроса.