Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1121323310
Max4
2005-07-14 10:41
2005.08.21
Редактирование записи.


1-1122847553
wp2
2005-08-01 02:05
2005.08.21
Очередная ошибка точности???!!!


1-1123086872
TerminalHead
2005-08-03 20:34
2005.08.21
SC_HANDLE


1-1122971216
webpauk
2005-08-02 12:26
2005.08.21
Handle формы


3-1121063866
Catik
2005-07-11 10:37
2005.08.21
Как проверить наличие таблицы в БД ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский