Форум: "Базы";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизПроблема при вставке записи с помощью хранимой процедуры Найти похожие ветки
← →
silvestr (2005-07-13 09:45) [0]В общем процедура :
CREATE PROCEDURE update_data (@seans Char(10), @user char(10), @group char(10), @comp char(10),@bron char(10), @uslug char(150),@sotrudnik char(10), @periodi char(10), @acess char(10))
AS
Insert Into Tab_update
Values (@seans,@user,@group,@comp,@bron,@uslug,@sotrudnik,@periodi,@acess)
GO
Вставляет каждый раз новые записи а таблиwe ( т.е добавляет их ) а как сделать чтобы записть происходила в одну строчку например в первую и процедура не добавляла записи а обновляла одну строчку
← →
ANB © (2005-07-13 09:50) [1]Гы. А чего ты еще хотел ? Посмотри в словарике слово Insert. И поищи в книжке update. А вообще, сначала надо книжку про SQL прочитать, а потом начинать писать хранимки.
← →
Ega23 © (2005-07-13 09:53) [2]
CREATE PROCEDURE update_data (@seans Char(10), @user char(10), @group char(10), @comp char(10),@bron char(10), @uslug char(150),@sotrudnik char(10), @periodi char(10), @acess char(10))
AS
declare @X int
Set @X=-1
Select @X=1 from Tab_update where Seans=@seans and User=@user and Group=@group and Comp=@comp
and Bron=@bron and Uslug=@uslug and Sotrudnik=@sotrudnik and Periodi=@periodi and acess=@acess
if @X=-1
Insert Into Tab_update
Values (@seans,@user,@group,@comp,@bron,@uslug,@sotrudnik,@periodi,@acess)
else
Update Tab_update Set
Seans=@seans,
User=@user,
Group=@group,
Comp=@comp,
Bron=@bron,
Uslug=@uslug,
Sotrudnik=@sotrudnik,
Periodi=@periodi,
Acess=@acess
GO
Хотя это всё жуткая глупость. Таблица составлена безобразно.
← →
ANB © (2005-07-13 09:58) [3]
> Ega23 © (13.07.05 09:53) [2]
- гы, смеялся еще раз. Зачем тут человеку пример, если он до сих пор не понимает, что Insert делает. И про апдейт не слышал. И ты еще удивляешься, как таблица безобразно придумана. Орех.
← →
Ega23 © (2005-07-13 10:07) [4]- гы, смеялся еще раз. Зачем тут человеку пример, если он до сих пор не понимает, что Insert делает. И про апдейт не слышал. И ты еще удивляешься, как таблица безобразно придумана. Орех.
Да так, настроение с утра сегодня хорошее. Работать не хоцца
← →
silvestr (2005-07-13 10:08) [5]> ANB © (13.07.05 09:58) [3]
Раз так хорошо знаешь то и подскажи !
> Ega23 © (13.07.05 09:53) [2]
Переделал название полей , в базу всё равно добавяються данные а не обновляються :(
CREATE PROCEDURE update_data (@udp_seans Char(10), @udp_user char(10), @udp_group char(10), @udp_comp char(10),@udp_bron char(10), @udp_uslug char(150),@udp_sotrudnik char(10), @udp_periodi char(10), @udp_acess char(10))
AS
declare @X int
Set @X=-1
Select @X=1 from Tab_update where udp_Seans=@udp_seans and udp_User=@udp_user and udp_Group=@udp_group and udp_Comp=@udp_comp
and udp_Bron=@udp_bron and udp_Uslug=@udp_uslug and udp_Sotrudnik=@udp_sotrudnik and udp_Periodi=@udp_periodi and udp_acess=@udp_acess
if @X=-1
Insert Into Tab_update
Values (@udp_seans,@udp_user,@udp_group,@udp_comp,@udp_bron,@udp_uslug,@udp_sotrudnik,@udp_periodi,@udp_acess)
else
Update Tab_update Set
udp_Seans=@udp_seans,
udp_User=@udp_user,
udp_Group=@udp_group,
udp_Comp=@udp_comp,
udp_Bron=@udp_bron,
udp_Uslug=@udp_uslug,
udp_Sotrudnik=@udp_sotrudnik,
udp_Periodi=@udp_periodi,
udp_Acess=@udp_acess
GO
← →
Ega23 © (2005-07-13 10:12) [6]Структуру таблицы Tab_update в студию!
З.Ы.
Таблица составлена безобразно.
← →
silvestr (2005-07-13 10:18) [7]> Ega23 © (13.07.05 10:12) [6]
Структура таблици :
ind int 4
udp_seans varchar 10
udp_user varchar 10
udp_group varchar 10
udp_comp varchar 10
udp_bron varchar 10
udp_uslug varchar 10
udp_sotrudnik varchar 10
udp_periodi varchar 10
udp_acess
← →
silvestr (2005-07-13 10:19) [8]udp_acess то же
udp_acess varchar 10
← →
evvcom © (2005-07-13 10:21) [9]
> в базу всё равно добавяються данные а не обновляються
Значит такие данные передаешь. Учти, что, вставив в Char(10) строку "123", а потом результат сравнив с "123", ты получишь false. Потому и вставляются.
> Ega23 © (13.07.05 09:53) [2]
Ты в апдейте where забыл. Но до него дело пока все равно не доходит.
← →
silvestr (2005-07-13 10:25) [10]> evvcom © (13.07.05 10:21) [9]
Если я передаю текущее время в формате 12:54:34 ? проблема будет ?
← →
Ega23 © (2005-07-13 10:25) [11]А, ну да, точно. Where забыл.
Так, автор, я у тебя вижу поле ind. Подозреваю, что это от Identificator.
А почему ты его не вставляешь? И параметром не передаёшь?
← →
Ega23 © (2005-07-13 10:31) [12]Если я передаю текущее время в формате 12:54:34 ? проблема будет ?
Для текущего времени есть тип datetime
З.Ы.
Таблица составлена безобразно.
← →
evvcom © (2005-07-13 11:11) [13]
> передаю текущее время в формате 12:54:34
с передачей даты/времени в текстовом формате всегда связаны проблемы. Сегодня ее может не быть, а завтра она всплывет. Связано это с региональными настройками. Измени разделитель времени с : на что-нибудь другое и встретишься с проблемой лицом к лицу. Аналогично с датой.
← →
silvestr (2005-07-13 11:21) [14]> Ega23 © (13.07.05 10:25) [11]
Where куда вставить ?
Ind по идее можно удалить , я по привычке его туда вписал
> evvcom © (13.07.05 11:11) [13] Мне она нужна просто как текст который постоянно изменяться вот и всё т.е я не рабоатю с датой я просто скидываю её для выявления изменений
← →
yk © (2005-07-13 11:30) [15]
> Set @X=-1
> Select @X=1 from Tab_update where udp_Seans=@udp_seans and
> udp_User=@udp_user and udp_Group=@udp_group and udp_Comp=@udp_comp
>
> and udp_Bron=@udp_bron and udp_Uslug=@udp_uslug and udp_Sotrudnik=@udp_sotrudnik
> and udp_Periodi=@udp_periodi and udp_acess=@udp_acess
если тебе всё равно нужна одна конкретна запись для обновления (Или это не так?), то почему ищешь её не по идешнику (primary key)?
← →
silvestr (2005-07-13 11:46) [16]> yk © (13.07.05 11:30) [15]
Да одна запись.
Это код не мой :( я тут новичёк , по этому не знаю что думать :(
← →
Ega23 © (2005-07-13 11:55) [17]Ну так и ищи эту запись по ind, в чём проблема-то?
← →
silvestr (2005-07-13 11:58) [18]> Ega23 © (13.07.05 11:55) [17]
Как ? Пробывал так не хочет работать :(
declare @X int
Set @X=-1
Select @X=1 from Tab_update where @ind="0"
← →
yk © (2005-07-13 11:59) [19]Сделай две процедуры - одна для создания новой записи,
другаю для обновления
В своей проге ты можешь узнать идешник нужной тебе записи и искать запись для обновления по идешнику - тогда точно будет только одна запись
← →
silvestr (2005-07-13 12:10) [20]Да я вручную в базе создам сам запись. Мне нужно чтобы хранимая процедура писала только в эту запись и всё ! не будет там записи никакой больше кроме одной. А вот как написать процедуру для обновления этой записи не знаю :( вот в этом и прошу помоч
← →
Ega23 © (2005-07-13 12:13) [21]Эх, молодёж-ж-ж-жь...
Print "Creating Table Tab_Update"
GO
Create Table Tab_Update
(
ind int 4 NOT NULL,
udp_seans varchar 10 NOT NULL,
udp_user varchar 10 NOT NULL,
udp_group varchar 10 NOT NULL,
udp_comp varchar 10 NOT NULL,
udp_bron varchar 10 NOT NULL,
udp_uslug varchar 10 NOT NULL,
udp_sotrudnik varchar 10 NOT NULL,
udp_periodi varchar 10 NOT NULL,
udp_acess varchar 10 NOT NULL,
Constraint PK_Ind primaty key (ind)
)
GO
Print "Creating SP SP_Tab_UpdateEdit"
go
if exists (select * from sysobjects where id = object_id(N"[SP_Tab_UpdateEdit]") and OBJECTPROPERTY(id, N"IsProcedure") = 1)
drop procedure [SP_Tab_UpdateEdit]
GO
CREATE PROCEDURE SP_Tab_UpdateEdit
@ind int=-1,
@udp_seans varchar(10)="",
@udp_user varchar(10)="",
.....
@udp_acess varchar (10)="",
@ActNam varchar(32)="NONE"
AS
declare
@result int,
@X int
set nocount ON
set @result=-1
set @ActNam=Upper(LTrim(RTrim(@ActNam)))
if @ActNam="TAB_UPDATE.UPD"
begin
Set @X=-1
Select @X=ind from Tab_Update where ind=@ind
if @X=-1
begin -- Insert
if @ind=-1 Select @Ind=IsNull(Max(ind)+1, 1) from Tab_Update
Insert Into Tab_Update (ind, upd_seans, upd_user, ... , upd_acess)
Values (@ind, @upd_seans, @upd_user, ... , @upd_acess)
Select @Result=@ind
end
else
begin -- Update
Update Tab_Update Set upd_seans=@updSeans, upd_user=@upd_user, .....,
upd_acess=@upd_acess
where ind=@ind
Select @Result=@ind
end
Goto Fin
end
fin:
set nocount off;
return(@result);
GO
Только параметры все надо будет подавать.
← →
ЮЮ © (2005-07-13 12:17) [22]>не будет там записи никакой больше кроме одной.
В чем тогда проблемы?
DELETE FROM Tab_update
Insert Into Tab_update ... все остальное уже у тебя есть :)
З.Ы. Не называй таблицу, которую и таблицей назвать стыдно, базой :)
← →
silvestr (2005-07-13 12:42) [23]Сделал так :
/*udp_seans varchar 10 NOT NULL,
udp_user varchar 10 NOT NULL,
udp_group varchar 10 NOT NULL,
udp_comp varchar 10 NOT NULL,
udp_bron varchar 10 NOT NULL,
udp_uslug varchar 10 NOT NULL,
udp_sotrudnik varchar 10 NOT NULL,
udp_periodi varchar 10 NOT NULL,
udp_acess varchar 10 NOT NULL,*/
CREATE PROCEDURE update_data
@ind int=-1,
@udp_seans varchar(10)="",
@udp_user varchar(10)="",
@udp_group varchar (10)="",
@udp_comp varchar (10)="",
@udp_bron varchar (10)="",
@udp_uslug varchar (10)="",
@udp_sotrudnik varchar (10)="",
@udp_periodi varchar (10)="",
@udp_acess varchar (10)=""
AS
declare
@result int,
@X int
set nocount ON
set @result=-1
begin
Set @X=-1
Select @X=ind from Tab_Update where ind=@ind
if @X=-1
begin -- Insert
if @ind=-1 Select @Ind=IsNull(Max(ind)+1, 1) from Tab_Update
Insert Into Tab_Update (ind,udp_seans,udp_user,udp_group,udp_comp,udp_bron,udp_uslug,udp_sotrudnik,udp_periodi,udp_acess)
Values (@ind, @udp_seans, @udp_user,@udp_group,@udp_comp,@udp_bron,@udp_uslug,@udp_sotrudnik,@udp_periodi, @udp_acess)
Select @Result=@ind
end
else
begin -- Update
Update Tab_Update Set udp_seans=@udp_Seans, udp_user=@udp_user, udp_group=@udp_group,udp_comp=@udp_comp,udp_bron=@udp_bron,
udp_uslug=@udp_uslug,@udp_sotrudnik=@udp_sotrudnik, udp_acess=@udp_acess
where ind=@ind
Select @Result=@ind
end
Goto Fin
end
fin:
set nocount off;
return(@result);
GO
В итоге всё равно запись добавляеться а не обновляеться.
Код создания таблици убрал так как таблица должна быть создана с самого начала, потому что к ней обращаються до того момента как была выполнена хранимая процедура
← →
Ega23 © (2005-07-13 12:45) [24]В итоге всё равно запись добавляеться а не обновляеться.
Строку вызова SP - в студию!
← →
evvcom © (2005-07-13 12:48) [25]
> Сделай две процедуры - одна для создания новой записи,
> другаю для обновления
Я это делаю в одной ХП. Если ID<>0, то update, иначе insert.
← →
Ega23 © (2005-07-13 12:52) [26]2 evvcom © (13.07.05 12:48) [25]
Я это делаю в одной ХП. Если ID<>0, то update, иначе insert.
Ашипка. ID может быть хоть 100, если нет записи с таким ID - Insert, есть - Update.
← →
evvcom © (2005-07-13 13:00) [27]
> Ega23 © (13.07.05 12:52) [26]
Я делаю именно так, как написал. Если записи с ID=100 нет, то update ... where ID=100 ничего не обновит. Это проблемы клиента, что он такой ID передал. Мои программы обновляют записи с известными им ID. Поэтому ошибки никакой нет.
← →
Ega23 © (2005-07-13 13:17) [28]Ну, может быть, может быть.
Это всего лишь стильпрограммирования. У разных людей он разный.
← →
evvcom © (2005-07-13 13:47) [29]В данном случае это не стиль, а идея.
← →
silvestr (2005-07-13 14:23) [30]всё спасибо всем , решил радикальным методом , очищаю таблицу потом пишу зановог в неё , получаеться одна запись :)
> Ega23 © (13.07.05 12:45) [24]
Я твой код возьму как основу для эксперементов , учиться нужно ведь :) Спасибо
← →
ANB © (2005-07-13 17:58) [31]
> Если записи с ID=100 нет, то update ... where ID=100 ничего
> не обновит. Это проблемы клиента, что он такой ID передал.
- а зачем тогда вообще ХП ? Одним апдейтом можно обойтись.
← →
evvcom © (2005-07-14 08:15) [32]
> - а зачем тогда вообще ХП ? Одним апдейтом можно обойтись.
Во-первых, не всегда одним апдейтом. Почти всегда присутствуют дополнительные условия в ХП.
А во-вторых, у меня привычка уже такая, никогда не давать пользователям прямой доступ к таблицам.
← →
Ega23 © (2005-07-14 09:48) [33]А во-вторых, у меня привычка уже такая, никогда не давать пользователям прямой доступ к таблицам.
И это пгавильно, тваорищЪ!
На самом деле этим ты в первую очередь себе упрощение делаешь. На случай, если структура базы поменяется.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.038 c